Введите пароль sudo в ожидании сценария - PullRequest
3 голосов
/ 15 апреля 2019

У меня есть ожидаемый код внутри скрипта bash, что-то вроде этого

env input1=${INPUT1} input2=${INPUT2} expect << "EOS"
    set timeout -1
    spawn ./another_script.sh
    expect {
        "Input 1" { send -- "$env(input1)\r";exp_continue }
        "Input 2" { send -- "$env(input2)\r";exp_continue }
        eof
    }
EOS

Во время выполнения another_script.sh мне предлагается ввести пароль sudo, но я не могу, так как я все еще ожидаю. Что я могу сделать, чтобы я мог ввести пароль sudo и чтобы скрипт продолжал работать после этого? Я не хочу сохранять пароль в сценарии, а затем передавать его ожидаемым образом, но я хочу иметь возможность ввести его.

Ответы [ 4 ]

2 голосов
/ 16 апреля 2019

Ответ от Donal Fellows - правильный путь, но для полноты здесь есть решение interact, которое вы пытались найти.Используемая команда:

expect {
    "Input 1" { send -- "$env(input1)\r"; exp_continue }
    "Input 2" { send -- "$env(input2)\r"; exp_continue }
    "password for" { stty -echo
                    interact -u tty_spawn_id -o "\r" return
                    stty echo
                    exp_continue }
    eof
}

Проблема, с которой вы столкнулись, заключается в том, что вы ожидаете выполнения сценария на stdin, поэтому при взаимодействии возникают проблемы, если вы не используете -u tty_spawn_id, чтобы заставить его работать с /dev/tty иПользователь.Вам необходимо явно включить / выключить эхо для этого tty, поскольку sudo сделает это только для pty между порожденной командой и ожидаем.

2 голосов
/ 15 апреля 2019

Стандартный способ обработки такого события состоит в том, чтобы отслеживать запрос пароля sudo, вводить его и затем продолжать.Но с долго работающим сценарием вы захотите кэшировать пароль в ожидаемом сценарии , чтобы вам не приходилось возвращаться к нему несколько раз в течение нескольких часов.В самом деле, для удобства использования вам, вероятно, нужно сначала запросить пароль, а не ждать, пока он понадобится базовой системе.

К счастью, ожидается, что в него включена поддержка stty, поэтому добавить его просто.

env input1=${INPUT1} input2=${INPUT2} expect << "EOS"
    # Prompt for password, cribbed/converted from example on expect(1) manpage
    stty -echo
    send_tty "sudo password: "
    expect_tty -re "(.*)\n"
    send_tty "\n"
    set password $expect_out(1,string)
    stty echo

    # Rest of the script, with clause for sending the password at the right time
    set timeout -1
    spawn ./another_script.sh
    expect {
        "Input 1" { send -- "$env(input1)\r"; exp_continue }
        "Input 2" { send -- "$env(input2)\r"; exp_continue }
        "assword: " { send -- "$password\r"; exp_continue }
        eof
    }
EOS
0 голосов
/ 15 апреля 2019

за то, что вы комментируете, я думаю, что у вас есть в cron.В этом случае вам необходимо запустить скрипт как sudo.Вы можете просто позвонить в sudo crontab.вы можете получить к нему доступ, набрав sudo crontab -e

0 голосов
/ 15 апреля 2019

С man sudo: политика sudoers кэширует учетные данные в течение 15 минут, если только они не переопределены в sudoers (5).

После этого вызовите sudo -v перед вызовом ожидайте.Он проверяет учетные данные, и если они не кэшируются, он запрашивает пароль root.Таким образом, вы можете ввести их до того, как expect, а затем sudo командам не нужно будет запрашивать снова.

...