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

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

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

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

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

Ответ 1

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

Ответ 2

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

echo <password> | sudo -S <command>

Я не уверен, что это помогает.

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

Ответ 3

Для ssh вы можете использовать sshpass: sshpass -p yourpassphrase ssh [email protected].

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

$ apt-get install sshpass
$ sshpass -p 'password' ssh [email protected]

Ответ 4

У меня есть:

ssh [email protected] bash -c "echo mypass | sudo -S mycommand"

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

Ответ 5

Это можно сделать, установив общедоступные/закрытые ключи на целевые хосты, к которым вы будете подключаться. Первым шагом было бы сгенерировать ключ ssh для пользователя, выполняющего script на локальном хосте, выполнив:

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>
[email protected]_host password: <Enter remote user password here>

После регистрации ключей ssh ​​вы сможете выполнить молчащий ssh [email protected]_host с вашего локального хоста.

Ответ 6

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

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

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

Ответ 7

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

sudo -S <<< "password" command

Ответ 8

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

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

Ответ 9

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

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

Ответ 10

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

expect -c 'spawn ssh [email protected];expect password;send "your-password\n";interact

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

Ответ 11

Установите SSH для аутентификации с открытым ключом, без пароля на Ключ. Грузы направляющих в сети. Вам тогда не понадобится пароль для входа. Затем вы можете ограничить соединения для ключа на основе имени хоста клиента. Обеспечивает разумную безопасность и отлично подходит для автоматизированного входа в систему.

Ответ 12

ssh -t -t [email protected] << EOF
echo SOMEPASSWORD | sudo -S do something
sudo do something else
exit
EOF

Ответ 13

У меня была та же проблема. dialog script для создания каталога на удаленном компьютере. диалог с 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 [email protected]$IP mkdir -p /home/$US/TARGET-FOLDER


   rm /tmp/ip

   rm /tmp/user

   rm /tmp/pass

приветствия из Германии

Titus

Ответ 14

Использование:

echo password | sudo command

Пример:

echo password | sudo apt-get update; whoami

Надеюсь, что это поможет.

Ответ 15

Основываясь на ответе @Jahid, это сработало для меня на macOS 10.13:

ssh <remote_username>@<remote_server> sudo -S <<< <remote_password> cat /etc/sudoers

Ответ 16

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

Ответ 17

Вы можете указать пароль как параметр для ожидания script.

Ответ 18

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

Это работает.

Ответ 19

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

Ответ 20

su -c "Command" < "Password"

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