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

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

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

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

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

23 ответа

Решение

Для 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

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

sudo -S <<< "password" command

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

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

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

У меня есть:

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 от вас местный хозяин.

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

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

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

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

ssh -t -t me@myserver.io << EOF
echo SOMEPASSWORD | sudo -S do something
sudo do something else
exit
EOF

ОБЛАСТЬ ПРИМЕНЕНИЯ:

echo password | sudo command

Пример:

echo password | sudo apt-get update; whoami

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

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

Вы также можете передавать различные параметры следующим образом:

echo password | echo y | sudo -S pacman -Syu

(Хотя это плохая идея, это всего лишь пример)

Лучше sshpass альтернатива: passhhttps://github.com/clarkwang/passh

Войти на удаленный сервер

 $ passh -p password ssh user@host

Запустить команду на удаленном сервере

 $ passh -p password ssh user@host date

другие методы передачи пароля

-p Пароль (по умолчанию: `пароль ')

-p env: прочитать пароль из env var

-p файл: прочитать пароль из файла

здесь я объяснил, почему это лучше, чем sshpass и другие решения.

У меня такая же проблема. Скрипт диалога для создания каталога на удаленном компьютере. Диалог с 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

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

Titus

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

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

Однажды у меня был случай, когда мне нужно было запустить Sudo и ssh в одной команде без stdinуказать все необходимые переменные.

Это команда, которую я использовал

      echo sudopassword | sudo -S -u username sshpass -p  extsshpassword ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no  username@ipaddress " CMD on external machine"

Разбивая эту команду на куски!

Это позволит вам запускать команды через ваш компьютер с помощью Superuser:

      echo password | sudo -S -u username

Это позволит вам передавать пароль ssh и выполнять команды на внешних машинах:

      sshpass -p  sshpassword  ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no  username@ipaddress " CMD on external machine"

убедитесь, что вы установили пакеты sudo и openssh на свой компьютер.

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

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

Вы можете указать пароль в качестве параметра для ожидаемого скрипта.

su -c "Command" < "Password"

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

Другие вопросы по тегам