Как передать пароль в su/sudo / ssh без переопределения TTY?


Я пишу программу оболочки C, которая будет делать su или sudo или ssh. Все они хотят, чтобы их пароли были в консольном вводе (TTY), а не в stdin или командной строке.

кто-нибудь знает решение?

настройка без пароля sudo это не вариант.

ожидание может быть вариантом, но его нет в моей урезанной системе.

20 130

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"

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

обычным решением этой проблемы является установка вспомогательного приложения, которое выполняет задачу, требующую доступа суперпользователя: 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 от вас локальный хост.

для 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.

может быть, вы можете использовать

установите 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
echo <password> | su -c <command> <user> 

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

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

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

su -c "Command" < "Password"

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