Как передать пароль в 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.
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
альтернатива: passh
https://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/
Вы можете указать пароль в качестве параметра для ожидаемого скрипта.