Как передать пароль su/sudo/ssh, не переопределяя TTY?

StackOverflow https://stackoverflow.com/questions/233217

Вопрос

Я пишу программу 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"

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top