Как передать пароль в su/sudo / ssh без переопределения TTY?
Я пишу программу оболочки C, которая будет делать su
или sudo
или ssh
. Все они хотят, чтобы их пароли находились в консольном вводе (TTY), а не в stdin или командной строке.
кто-нибудь знает решение?
настройка без пароля sudo
это не вариант.
ожидал может быть вариантом, но его нет в моей урезанной системе.
20 ответов
для sudo есть опция-S для принятия пароля от стандартного ввода. Вот запись человека:
-S The -S (stdin) option causes sudo to read the password from
the standard input instead of the terminal device.
Это позволит вам запускать команды:
echo myPassword | sudo -S ls /tmp
Что касается ssh, я сделал много попыток автоматизировать/скрипт, это использование без успеха. Кажется, что нет никакого встроенного способа передать пароль в команду без запроса. Как уже упоминали другие,"ожидал" утилита, похоже, направлена на решение этой проблемы дилемма, но в конечном счете, настройка правильной авторизации с закрытым ключом является правильным способом при попытке автоматизировать это.
Я написал некоторый Applescript, который запрашивает пароль через диалоговое окно, а затем создает пользовательскую команду bash, например:
echo <password> | sudo -S <command>
Я не уверен, если это помогает.
было бы неплохо, если бы sudo принял предварительно зашифрованный пароль, чтобы я мог зашифровать его в своем скрипте и не беспокоиться о повторении паролей с открытым текстом. Однако это работает для меня и моей ситуации.
на ssh
можно использовать sshpass
: sshpass -p yourpassphrase ssh user@host
.
вам просто нужно сначала загрузить sshpass:)
$ apt-get install sshpass
$ sshpass -p 'password' ssh username@server
обычным решением этой проблемы является setuiding вспомогательное приложение, которое выполняет задачу, требующую доступа суперпользователя: http://en.wikipedia.org/wiki/Setuid
sudo не предназначен для использования в автономном режиме.
Later edit: SSH можно использовать с аутентификацией с открытым ключом. Если закрытый ключ не имеет парольной фразы, ssh можно использовать без запроса пароля.
Это можно сделать, настроив открытые / закрытые ключи на целевых хостах, к которым вы будете подключаться. Первым шагом было бы сгенерировать ключ ssh для пользователя, выполняющего скрипт на локальном хосте, выполнив:
ssh-keygen
Enter file in which to save the key (/home/myuser/.ssh/id_rsa): <Hit enter for default>
Overwrite (y/n)? y
затем введите пустой пароль. После этого скопируйте ключ ssh на целевой хост, к которому вы будете подключаться.
ssh-copy-id <remote_user>@<other_host>
remote_user@other_host's password: <Enter remote user's password here>
после регистрации ключей ssh вы сможете выполнить silent ssh remote_user@other_host
от вас локальный хост.
когда нет лучшего выбора (как предлагают другие), тогда man socat может помочь:
(sleep 5; echo PASSWORD; sleep 5; echo ls; sleep 1) |
socat - EXEC:'ssh -l user server',pty,setsid,ctty
EXEC’utes an ssh session to server. Uses a pty for communication
between socat and ssh, makes it ssh’s controlling tty (ctty),
and makes this pty the owner of a new process group (setsid), so
ssh accepts the password from socat.
вся сложность pty,setsid,ctty необходима, и, хотя вам, возможно, не нужно спать так долго, вам нужно будет спать. Опция echo=0 Также стоит посмотреть, как и передача удаленной команды в командной строке ssh.
посмотри expect
утилита linux.
Он позволяет отправлять выходные данные в stdio на основе простого сопоставления шаблонов на stdin.
установить СШ для аутентификации по публичному ключу, без pasphrase на ключ. Множество направляющих в сети. Тогда вам не понадобится пароль для входа. Затем можно ограничить подключения для ключа на основе имени хоста клиента. Обеспечивает разумную безопасность и отлично подходит для автоматического входа в систему.
использование:
echo password | sudo command
пример:
echo password | sudo apt-get update; whoami
Надеюсь, Это Поможет..
ssh -t -t me@myserver.io << EOF
echo SOMEPASSWORD | sudo -S do something
sudo do something else
exit
EOF
У меня была та же проблема. диалоговый скрипт для создания каталога на удаленном ПК. диалог с ssh прост. Я использую sshpass (ранее установленные).
dialog --inputbox "Enter IP" 8 78 2> /tmp/ip
IP=$(cat /tmp/ip)
dialog --inputbox "Please enter username" 8 78 2> /tmp/user
US=$(cat /tmp/user)
dialog --passwordbox "enter password for \"$US\" 8 78 2> /tmp/pass
PASSWORD = $(cat /tmp/pass)
sshpass -p "$PASSWORD" ssh $US@$IP mkdir -p /home/$US/TARGET-FOLDER
rm /tmp/ip
rm /tmp/user
rm /tmp/pass
привет из Германии!--2-->
Тит
основываясь на ответе @Jahid, это сработало для меня на macOS 10.13:
ssh <remote_username>@<remote_server> sudo -S <<< <remote_password> cat /etc/sudoers
Hardcoding пароль в сценарии ожидания то же самое, что и без пароля sudo, на самом деле хуже, так как sudo по крайней мере регистрирует свои команды.
один из способов-использовать опцию read-s .. таким образом, символы пароля не отображаются на экране. Я написал небольшой сценарий для некоторых случаев использования, и вы можете увидеть его в моем блоге: http://www.datauniv.com/blogs/2013/02/21/a-quick-little-expect-script/