Как ввести пароль для команды, которая запрашивает его в bash?

Как ввести пароль для команды, которая запрашивает его в bash?

01.02.2011 03:26:05 Просмотров 232 Источник

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

function() {
    echo "password" | command
}

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

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

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

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

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

У вопроса есть решение - Посмотреть?

Ответы - Как ввести пароль для команды, которая запрашивает его в bash? / How to provide password to a command that prompts for one in bash?

paxdiablo

01.02.2011 03:32:04

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

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

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

https://stackoverflow.com/questions/4857702/how-to-provide-password-to-a-command-that-prompts-for-one-in-bash/4857724#comment5411856_4857724
Вы правы, я понимаю, почему это дыра в безопасности, но я уже в безопасной среде, поэтому моя главная забота-что-то быстро-Н-грязное, не прибегая к серьезному обману. Спасибо за ответ!
Keith

01.02.2011 03:32:27

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

https://stackoverflow.com/questions/4857702/how-to-provide-password-to-a-command-that-prompts-for-one-in-bash/4857729#comment74126947_4857729
не могли бы вы привести хотя бы минимальный пример этого ?
Ratinho

01.02.2011 03:34:28

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

https://stackoverflow.com/questions/4857702/how-to-provide-password-to-a-command-that-prompts-for-one-in-bash/4857739#comment5397440_4857739
Я не думаю, что ОП просто спрашивает о passwd.
Является ответом!
SiegeX

01.02.2011 04:32:34

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

https://stackoverflow.com/questions/4857702/how-to-provide-password-to-a-command-that-prompts-for-one-in-bash/4858028#comment5411819_4858028
Замечательно-видя, как мое настоящее намерение состоит в том, чтобы быть в состоянии сделать что-то быстро-Н-грязное, это именно то, что мне нужно!
https://stackoverflow.com/questions/4857702/how-to-provide-password-to-a-command-that-prompts-for-one-in-bash/4858028#comment48964201_4858028
Спас меня, набрав один и тот же пароль три раза в моем печально реализованном VPN. (Я также создал скрипт, который просто работает expect vpn.sh)
https://stackoverflow.com/questions/4857702/how-to-provide-password-to-a-command-that-prompts-for-one-in-bash/4858028#comment76513010_4858028
Было бы здорово, если бы в ответ был включен хотя бы краткий фрагмент. Ссылки не всегда срабатывают шесть лет спустя. А вот этот-да, но... :)
https://stackoverflow.com/questions/4857702/how-to-provide-password-to-a-command-that-prompts-for-one-in-bash/4858028#comment76985619_4858028
@Unsigned обновил ссылку, чтобы гарантировать, что это будет держаться в течение длительного времени. Не совсем то, что вы ищете, но ответ Эрика приведет вас туда.
Eric Leschinski

03.12.2013 12:02:55

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

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

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

Не раскрывайте свой пароль root или пароли опытных пользователей, передавая их через expect подобным образом. Корневые наборы найдут это в одно мгновение, и ваша коробка будет принадлежать.

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. Вам нужно будет убедиться, что приведенные выше команды expect подходят. Если сценарий autoexpect слишком чувствителен или недостаточно чувствителен, то он зависнет. В этом случае это приемлемо, потому что ожидание-это ожидание текста, который всегда будет приходить.

  9. Запустите ожидаем скрипт как пользователь Эл:

    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, и Эл никогда не вводил пароль. Если вы предоставите свой пароль root, sudo или power user с помощью этого скрипта, то получить root на вашем ящике будет легко. Таково наказание за систему безопасности, которая не позволяет никому задавать вопросы.

https://stackoverflow.com/questions/4857702/how-to-provide-password-to-a-command-that-prompts-for-one-in-bash/20336804#comment67846617_20336804
Этот пост не должен быть так же высоко поднят, как он есть. Пароли создаются не просто так, и это в основном разрушает эту цель.
Alex Bins

29.08.2015 12:23:32

Просто использовать :

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

Roozbeh

06.01.2016 04:58:28

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

function shutd()
{
  echo "mySuperSecurePassword" | sudo -S shutdown -h now
}    
https://stackoverflow.com/questions/4857702/how-to-provide-password-to-a-command-that-prompts-for-one-in-bash/34634948#comment79289135_34634948
Большое вам спасибо. Это прекрасно работает как быстрая и грязная, ванильная реализация.
Matthias Braun

22.01.2020 08:01:48

с read

Вот пример, который использует read, чтобы получить пароль и сохранить его в переменной pass. Затем 7zиспользует пароль для создания зашифрованного архива:

read -s -p "Enter password: " pass && 7z a archive.zip a_file -p"$pass"; unset pass

Но имейте в виду, что пароль можно легко пронюхать .

Закрыть X