Ответ 1
Взгляните на autoexpect
(достойный учебник ЗДЕСЬ). Это примерно так же быстро и грязно, как вы можете получить, не прибегая к обману.
Я пишу функцию оболочки UNIX, которая будет выполнять команду, которая будет запрашивать у пользователя пароль. Я хочу жестко закодировать пароль в script и предоставить его команде. Я попытался подключить пароль к команде следующим образом:
function() {
echo "password" | command
}
Это может не работать для некоторых команд, так как команда может сбросить входной буфер перед запросом пароля.
Я также попытался перенаправить стандартный ввод в файл, содержащий пароль, подобный этому, но это тоже не работает:
function() {
echo "password" > pass.tmp
command < pass.tmp
rm pass.tmp
}
Я знаю, что некоторые команды допускают предоставление пароля в качестве аргумента, но я предпочитаю использовать стандартный ввод.
Я ищу быстрый и грязный способ подключения пароля к команде в bash.
Взгляните на autoexpect
(достойный учебник ЗДЕСЬ). Это примерно так же быстро и грязно, как вы можете получить, не прибегая к обману.
Как использовать 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 на вашем поле будет легко. Таков штраф за систему безопасности, которая позволяет всем не задавать никаких вопросов.
Защищенные команды не позволят это, и это правильно, я боюсь - это дыра в безопасности, с которой вы могли бы управлять грузовиком.
Если ваша команда не позволяет использовать перенаправление ввода или параметр командной строки или файл конфигурации, вам придется прибегать к серьезным трюкам.
Некоторые приложения действительно откроют /dev/tty
, чтобы у вас было трудное время, чтобы победить безопасность. Вы можете обойти их, временно захватив /dev/tty
(например, создавая свой собственный канал), но для этого требуются серьезные привилегии и даже его можно победить.
Вы можете использовать флаг -S
для чтения со входа std. Ниже приведен пример:
function shutd()
{
echo "mySuperSecurePassword" | sudo -S shutdown -h now
}
Программы, которые запрашивают пароли, обычно устанавливают tty в "сырой" режим и читают ввод непосредственно из tty. Если вы создадите подпроцесс в pty, вы можете сделать эту работу. Это то, что ожидает...
Просто используйте:
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
Это действительно небезопасная идея, но: Использование команды passwd из оболочки script