Подтвердить что ты не робот

Как предоставить пароль команде, запрашивающей одну в bash?

Я пишу функцию оболочки UNIX, которая будет выполнять команду, которая будет запрашивать у пользователя пароль. Я хочу жестко закодировать пароль в script и предоставить его команде. Я попытался подключить пароль к команде следующим образом:

function() {
    echo "password" | command
}

Это может не работать для некоторых команд, так как команда может сбросить входной буфер перед запросом пароля.

Я также попытался перенаправить стандартный ввод в файл, содержащий пароль, подобный этому, но это тоже не работает:

function() {
    echo "password" > pass.tmp
    command < pass.tmp
    rm pass.tmp
}

Я знаю, что некоторые команды допускают предоставление пароля в качестве аргумента, но я предпочитаю использовать стандартный ввод.

Я ищу быстрый и грязный способ подключения пароля к команде в bash.

4b9b3361

Ответ 1

Взгляните на autoexpect (достойный учебник ЗДЕСЬ). Это примерно так же быстро и грязно, как вы можете получить, не прибегая к обману.

Ответ 2

Как использовать autoexpect для соединения пароля с командой:

Эти шаги иллюстрируются рабочим столом Ubuntu 12.10. Точные команды для вашего распространения могут быть немного разными.

Это опасно, потому что вы рискуете подвергать любой пароль, который вы используете для всех, кто может читать файл autoexpect script.

НЕ ОТКРЫВАЙТЕ свой пароль root или пароль пользователя пользователя, проложив их, ожидайте, как это сделать. Корневые наборы найдут это в одно мгновение, и ваша коробка будет принадлежать.

EXPECT запускает процесс, считывает текст, который приходит, затем отправляет текст, предварительно определенный в файле script.

  • Убедитесь, что установлены expect и autoexpect:

    sudo apt-get install expect
    sudo apt-get install expect-dev
    
  • Читайте на нем:

    man expect
    man autoexpect
    
  • Перейдите в свой домашний каталог:

    cd /home/el
    
  • Пользователь el не может кормить файл root и должен ввести пароль:

    touch testfile.txt
    sudo chown root:root testfile.txt 
       [enter password to authorize the changing of the owner]
    
  • Это пароль, который мы хотим автоматизировать. Перезагрузите терминал, чтобы убедиться, что sudo снова запросит пароль. Перейдите в /home/el и сделайте следующее:

    touch myfile.txt
    
    autoexpect -f my_test_expect.exp sudo chown root:root myfile.txt
    
        [enter password which authorizes the chown to root]
    
    autoexpect done, file is my_test_expect.exp
    
  • Вы создали файл my_test_expect.exp. Ваш супер секретный пароль хранится в этом файле. Это должно сделать вас ОЧЕНЬ неудобно. Смягчите некоторый дискомфорт, максимально ограничив права и права собственности:

    sudo chown el my_test_expect.exp     //make el the owner.
    sudo chmod 700 my_test_expect.exp    //make file only readable by el.
    
  • Вы видите эти команды в нижней части my_test_expect.exp:

    set timeout -1
    spawn sudo chown root:root myfile.txt
    match_max 100000
    expect -exact "\[sudo\] password for el: "
    send -- "YourPasswordStoredInPlaintext\r"
    expect eof
    
  • Вам нужно будет убедиться, что указанные выше команды ожидания подходят. Если autoexpect script слишком чувствителен или недостаточно чувствителен, он будет зависать. В этом случае это приемлемо, потому что ожидание ожидает текста, который всегда будет прибывать.

  • Выполнить ожидание script как пользователь el:

    expect my_test_expect.exp 
    spawn sudo chown root:root myfile.txt
    [sudo] password for el: 
    
  • Пароль, содержащийся в my_test_expect.exp, был отправлен в корне пользователем el. Чтобы узнать, был ли пароль принят, посмотрите myfile.txt:

    ls -l
    -rw-r--r--  1 root root          0 Dec  2 14:48 myfile.txt
    

Это сработало, потому что это root, а el никогда не вводил пароль. Если вы выставляете пароль root, sudo или power user с помощью этого script, то получение root на вашем поле будет легко. Таков штраф за систему безопасности, которая позволяет всем не задавать никаких вопросов.

Ответ 3

Защищенные команды не позволят это, и это правильно, я боюсь - это дыра в безопасности, с которой вы могли бы управлять грузовиком.

Если ваша команда не позволяет использовать перенаправление ввода или параметр командной строки или файл конфигурации, вам придется прибегать к серьезным трюкам.

Некоторые приложения действительно откроют /dev/tty, чтобы у вас было трудное время, чтобы победить безопасность. Вы можете обойти их, временно захватив /dev/tty (например, создавая свой собственный канал), но для этого требуются серьезные привилегии и даже его можно победить.

Ответ 4

Вы можете использовать флаг -S для чтения со входа std. Ниже приведен пример:

function shutd()
{
  echo "mySuperSecurePassword" | sudo -S shutdown -h now
}    

Ответ 5

Программы, которые запрашивают пароли, обычно устанавливают tty в "сырой" режим и читают ввод непосредственно из tty. Если вы создадите подпроцесс в pty, вы можете сделать эту работу. Это то, что ожидает...

Ответ 6

Просто используйте:

echo "password" | sudo -S mount -t vfat /dev/sda1 /media/usb/;
if [ $? -eq 0 ]; then
    echo -e '[ ok ] Usb key mounted'
else
    echo -e '[warn] The USB key is not mounted'
fi

Этот код работает для меня, а его в/etc/init.d/myscriptbash.sh