Как передать пароль в 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
обычным решением этой проблемы является установка вспомогательного приложения, которое выполняет задачу, требующую доступа суперпользователя: http://en.wikipedia.org/wiki/Setuid
sudo не предназначен для использования в автономном режиме.
позднее редактирование: 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, вы сможете выполнить беззвучный
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.
установите SSH для аутентификации с открытым ключом, без парольной фразы на ключе. Множество руководств в сети. Тогда вам не понадобится пароль для входа в систему. Затем можно ограничить подключения для ключа на основе имени хоста клиента. Обеспечивает разумную безопасность и отлично подходит для автоматического входа в систему.
использование:
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
жесткое кодирование пароля в сценарии expect-это то же самое, что иметь sudo без пароля, на самом деле хуже, так как sudo по крайней мере регистрирует свои команды.
один из способов-использовать опцию read-S.. таким образом, символы пароля не отображаются на экране. Я написал небольшой скрипт для некоторых случаев использования, и вы можете увидеть его в моем блоге: http://www.datauniv.com/blogs/2013/02/21/a-quick-little-expect-script/