Как передать пароль в su / sudo / ssh без переопределения TTY? - PullRequest
136 голосов
/ 24 октября 2008

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

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

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

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

Ответы [ 20 ]

199 голосов
/ 01 декабря 2010

Для 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, я предпринял много попыток автоматизировать / сценарий его использования безуспешно. Кажется, что нет встроенного способа передать пароль в команду без запроса. Как уже упоминали другие, утилита « Ожидает », похоже, нацелена на решение этой дилеммы, но, в конечном счете, правильная авторизация с закрытым ключом - правильный путь при попытке ее автоматизации. *

35 голосов
/ 09 декабря 2008

Я написал некоторый Applescript, который запрашивает пароль через диалоговое окно, а затем строит собственную команду bash, например:

echo <password> | sudo -S <command>

Я не уверен, поможет ли это.

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

25 голосов
/ 13 января 2012

Для ssh вы можете использовать sshpass: sshpass -p yourpassphrase ssh user@host.

Вам просто нужно сначала скачать sshpass:)

$ apt-get install sshpass
$ sshpass -p 'password' ssh username@server
12 голосов
/ 07 января 2011

У меня есть:

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

У меня работает.

10 голосов
/ 30 июля 2012

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

9 голосов
/ 09 июня 2015

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

sudo -S <<< "password" command
9 голосов
/ 24 октября 2008

Обычным решением этой проблемы является настройка вспомогательного приложения, которое выполняет задачу, требующую доступа суперпользователя: http://en.wikipedia.org/wiki/Setuid

Sudo не предназначен для использования в автономном режиме.

Позднее редактирование: SSH может использоваться с аутентификацией с закрытым открытым ключом. Если закрытый ключ не имеет парольной фразы, можно использовать ssh без запроса пароля.

6 голосов
/ 16 сентября 2011

Когда нет лучшего выбора (как предлагают другие), тогда человек соцат может помочь:

   (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.

5 голосов
/ 24 октября 2008

Взгляните на expect утилиту linux.

Позволяет отправлять вывод в stdio на основе простого сопоставления с образцом в stdin.

5 голосов
/ 08 мая 2012

Может быть, вы можете использовать команду expect?:

expect -c 'spawn ssh root@your-domain.com;expect password;send "your-password\n";interact

Эта команда дает пароль автоматически.

...