Как предоставить пароль для команды, которая запрашивает один в Bash? - PullRequest
34 голосов
/ 01 февраля 2011

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

function() {
    echo "password" | command
}

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

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

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

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

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

Ответы [ 7 ]

32 голосов
/ 03 декабря 2013

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

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

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

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

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

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

    sudo apt-get install expect
    sudo apt-get install expect-dev
    
  2. Читайте об этом:

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

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

    touch testfile.txt
    sudo chown root:root testfile.txt 
       [enter password to authorize the changing of the owner]
    
  5. Это ввод пароля, который мы хотим автоматизировать. Перезапустите терминал, чтобы 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
    
  6. Вы создали 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.
    
  7. Вы видите эти виды команд внизу 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
    
  8. Вам необходимо убедиться, что приведенные выше ожидаемые команды являются подходящими. Если сценарий автоэкспонирования слишком чувствительный или недостаточно чувствительный, он будет зависать. В этом случае это приемлемо, потому что ожидающий ожидает текст, который всегда будет поступать.

  9. Запустите ожидаемый сценарий от имени пользователя el:

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

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

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

20 голосов
/ 01 февраля 2011

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

6 голосов
/ 06 января 2016

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

function shutd()
{
  echo "mySuperSecurePassword" | sudo -S shutdown -h now
}    
6 голосов
/ 01 февраля 2011

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

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

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

2 голосов
/ 01 февраля 2011

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

1 голос
/ 29 августа 2015

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

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

0 голосов
/ 01 февраля 2011

Это действительно небезопасная идея, но: Использование команды passwd из скрипта оболочки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...