Как передать пароль в 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

Я:

ssh user@host bash -c "echo mypass | sudo -S mycommand"

работает для меня.


обычным решением этой проблемы является 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 от вас локальный хост.


для sudo вы можете сделать это тоже:

sudo -S <<< "password" command

когда нет лучшего выбора (как предлагают другие), тогда 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

echo <password> | su -c <command> <user> 

это работает.


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


один из способов-использовать опцию read-s .. таким образом, символы пароля не отображаются на экране. Я написал небольшой сценарий для некоторых случаев использования, и вы можете увидеть его в моем блоге: http://www.datauniv.com/blogs/2013/02/21/a-quick-little-expect-script/


su -c "Command" < "Password"

надеюсь, что это полезно.