Как передать пароль su/sudo/ssh, не переопределяя TTY?
Вопрос
Я пишу программу C Shell, которая будет делать su
или sudo
или ssh
.Все они хотят, чтобы их пароли вводились в консоль (TTY), а не в стандартный ввод или командную строку.
Кто-нибудь знает решение?
Настройка без пароля sudo
это не вариант.
ожидать мог бы быть вариант, но его нет в моей урезанной системе.
Решение
Для 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 ваша пароль ssh user @ host
.
Вам просто нужно сначала скачать sshpass:)
$ apt-get install sshpass
$ sshpass -p 'password' ssh username@server
У меня есть:
ssh user@host bash -c "echo mypass | sudo -S mycommand"
У меня работает.
Это можно сделать путем настройки открытого/закрытого ключей на целевых хостах, к которым вы будете подключаться.Первым шагом будет создание 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
от вашего местного хоста.
Обычное решение этой проблемы - настройка вспомогательного приложения, которое выполняет задачу, требующую доступа суперпользователя: http://en.wikipedia.org/wiki/Setuid
Sudo не предназначен для использования в автономном режиме.
Позднее редактирование: SSH может использоваться с аутентификацией с закрытым открытым ключом. Если закрытый ключ не имеет парольной фразы, можно использовать ssh без запроса пароля.
Для sudo вы тоже можете это сделать:
sudo -S <<< "password" command
Когда нет лучшего выбора (как это предлагают другие), тогда человек 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 -c 'spawn ssh root@your-domain.com;expect password;send "your-password\n";interact
Эта команда дает пароль автоматически.
Взгляните на утилиту ожидайте
linux.
Позволяет отправлять вывод в stdio на основе простого сопоставления с образцом в stdin.
Настройте SSH для аутентификации с открытым ключом, без ключевой фразы. Нагрузки гидов в сети. Вам не понадобится пароль для входа в систему. Затем вы можете ограничить количество соединений для ключа на основе имени хоста клиента. Обеспечивает разумную безопасность и отлично подходит для автоматизированных входов в систему.
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
привет из Германии
Титус
ИСПОЛЬЗОВАТЬ:
echo password | sudo command
Пример:
echo password | sudo apt-get update; whoami
Надеюсь, поможет..
Опираясь на ответ @ Джахида, у меня это сработало в macOS 10.13:
ssh <remote_username>@<remote_server> sudo -S <<< <remote_password> cat /etc/sudoers
Вы можете указать пароль в качестве параметра для ожидаемого сценария.
echo <password> | su -c <command> <user>
Это работает.
Жесткое кодирование пароля в ожидаемом скрипте - это то же самое, что использование sudo без пароля, на самом деле хуже, поскольку sudo, по крайней мере, регистрирует свои команды.
Один из способов - использовать опцию read -s. Таким образом, символы пароля не возвращаются на экран. Я написал небольшой сценарий для некоторых случаев использования, и вы можете увидеть его в моем блоге: http://www.datauniv.com/ блоги / 2013/02/21 / а-быстро-мало ожидать-скрипт /
su -c "Command" < "Password"
Надеюсь, это полезно.