ожидать, не соответствует шаблону правильно - PullRequest
1 голос
/ 23 января 2020

Я попытался автоматизировать генерацию запроса easyrsa с помощью ожидаемого. Я придумал сценарий bash:

#!/bin/bash

firstname=$1
lastname=$2
mail=$3
department=$4
password=$5
[...]

cd /VPN-CA/

/usr/bin/expect -c "
    spawn ./easyrsa gen-req $mail
    expect \"Enter PEM pass phrase:\"
    send \"$password\r\"
    expect \"Verifying - Enter PEM pass phrase:\"
    send \"$password\r\"
    expect \"Country Name (2 letter code) \[DE\]:\"
    send \"\r\"
    expect \"State or Province Name (full name) \[MyState\]:\"
    send \"\r\"
    expect \"Locality Name (eg, city) \[MyCity\]:\"
    send \"\r\"
    expect \"Organization Name (eg, company) \[MyOrganization\]:\"
    send \"\r\"
    expect \"Organizational Unit Name (eg, section) \[MyDepartment\]:\"
    send \"$department\r\"
    expect \"Common Name (eg: your user, host, or server name) \[$mail\]:\"
    send \"$firstname $lastname\r\"
    expect \"Email Address \[email@address.de\]:\"
    send \"$mail\r\"
    expect eof
"

# do somethin else
[...]

exit 0

Сценарий работает, и запрос будет сгенерирован правильно, но ожидание будет очень медленным. С -d он показывает мне для каждого ожидаемого шаблона после второго запроса пароля что-то вроде этого:

expect: does "test\r\n\r\n-----\r\nYou are about to be asked to enter information that will be incorporated\r\ninto your certificate request.\r\nWhat you are about to enter is what is called a Distinguished Name or a DN.\r\nThere are quite a few fields but you can leave some blank\r\nFor some fields there will be a default value,\r\nIf you enter '.', the field will be left blank.\r\n-----\r\n" (spawn_id exp3) match glob pattern "Country Name (2 letter code) [DE]:"? no
Country Name (2 letter code) [DE]:
expect: does "test\r\n\r\n-----\r\nYou are about to be asked to enter information that will be incorporated\r\ninto your certificate request.\r\nWhat you are about to enter is what is called a Distinguished Name or a DN.\r\nThere are quite a few fields but you can leave some blank\r\nFor some fields there will be a default value,\r\nIf you enter '.', the field will be left blank.\r\n-----\r\nCountry Name (2 letter code) [DE]:" (spawn_id exp3) match glob pattern "Country Name (2 letter code) [DE]:"? no
expect: timed out
send: sending "\r" to { exp3 }

Я не понимаю, почему шаблон не совпадает. Я имею в виду, что, хотя ответ и отправляется после истечения времени ожидания, он работает, но чертовски медленно ... (и это дерьмо)

Кто-нибудь имеет объяснение или решение этой проблемы?

Ответы [ 3 ]

1 голос
/ 24 января 2020

Проблема в вашем коде состоит в том, что оболочка удаляет обратные слеши при построении строки, поэтому ожидающие видят неэкранированные скобки - подстановка команд. В вашем коде вам придется удваивать backsla sh открывающие скобки.

Та же проблема возникает здесь:

expect -c "
   ...
   send \"$password\r\"

Предположим, что $ password равен "1234", тогда ожидаем, что см .:

    send "1234r" ;# <= no carriage return!

Использование строки в двойных кавычках для хранения ожидаемого кода очень быстро приводит к цитированию ада. Вместо этого используйте вот-сделать c:

/usr/bin/expect <<END_EXPECT
    spawn ./easyrsa gen-req $mail
    expect "Enter PEM pass phrase:"
    send "$password\r"
    expect "Verifying - Enter PEM pass phrase:"
    send "$password\r"
    expect "Country Name (2 letter code) \[DE\]:"
    send "\r"
    expect "State or Province Name (full name) \[MyState\]:"
    send "\r"
    expect "Locality Name (eg, city) \[MyCity\]:"
    send "\r"
    expect "Organization Name (eg, company) \[MyOrganization\]:"
    send "\r"
    expect "Organizational Unit Name (eg, section) \[MyDepartment\]:"
    send "$department\r"
    expect "Common Name (eg: your user, host, or server name) \[$mail\]:"
    send "$firstname $lastname\r"
    expect "Email Address \[email@address.de\]:"
    send "$mail\r"
    expect eof
END_EXPECT

Если вы используете фигурные скобки (ожидайте единственного цитирования), вам не нужно выходить за скобки:

    expect {Email Address [email@address.de]:}
0 голосов
/ 23 января 2020

Кажется, это проблема выхода из \[, закрывающую квадратную скобку не нужно экранировать.

Не удается обнаружить линию.

expect \"Country Name (2 letter code) \[DE\]:\"

Но вы можете заменить его подстановочным знаком ?

expect \"Country Name (2 letter code) ?DE]:\"

Или вы можете избежать открывающей квадратной скобки, используя только 6 обратных слешей:

expect \"Country Name (2 letter code) \\\\\\[DE]:\"
0 голосов
/ 23 января 2020

Просто для дальнейшего устранения неполадок, можете ли вы просто проверить, работает ли система в целом медленно или только при выполнении команды ожидающих.

Иногда из-за задержки в разрешении имен DNS также медленно реагирует система. Проверьте и удалите все ненужные записи в /etc/resolve.conf, а затем попробуйте.

...