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


148

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

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

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

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



Ответы:


215

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


2
К счастью, в Ruby есть встроенный SSH-клиент, который позволяет вам указать пароль. Вы можете попробовать ruby ​​-e "require 'net / ssh'; Net :: SSH.start (" example.com "," test_user ",: password => 'secret') do | ssh | Put 'Успешный вход в систему'; пока cmd = получает; помещает ssh.exec! (cmd); end end "
user1158559

13
Я ненавижу быть участником вечеринки здесь, но это может привести к тому, что ваш пароль появится в списке процессов. Я пытался найти лучший путь, наткнулся на эту статью и был удивлен, что никто не указал на нее. Отличное решение, но остерегайтесь рисков.
Мэтт

О ssh, вы пробовали передавать пароль в строке подключения? как nonroot:yourpassword@hostname.com? Конечно, все намного проще, если вы используете аутентификацию ключей и менеджер ключей.
Killah

12
Избегайте отображения пароля в списке процессов или лог-файлах, поместив его в файл и используя cat; 'cat pw | sudo -S <command>и позже rm pw.
CAB

Другой способ - использовать netcat и доставить пароль через сокет - nc -l 12345 | sudo -S <command>. На отправляющей стороне; echo myPassord | nc <target> 12345, Это просто перемещает проблему обработки пароля, но, вероятно, на главную консоль, где у вас есть больше возможностей.
CAB

36

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

echo <password> | sudo -S <command>

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

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


27

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

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

$ apt-get install sshpass
$ sshpass -p 'password' ssh username@server

12

У меня есть:

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

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


Не работал для меня все еще ssh запрашивает пароль.
AKS

Отлично, наконец то, что я могу использовать! Спасибо. Я использую это в скрипте bash, который запускает сессию ssh и передает клиенту команды sudo. Мой сценарий имеет следующие строки: ssh -t username @ hostname bash -c "sudo echo fartjuice"
Джеймс Т Снелл

12

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

sudo -S <<< "password" command

10

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

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

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


10

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


7

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

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

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


Выглядит хорошо, но как я могу включить команду ожидаем на машине без прав root?
Radon8472

1
@ Radon8472 Исполняемый файл можно добавить в ~ / bin, если у вас нет прав для его установки. Если ваша система не добавляет автоматически ~ / bin в PATH, вы можете сделать это вручную с помощью команды export PATH = "$ PATH: ~ / bin" или добавить эту команду в свой профиль, чтобы сделать это автоматически. Если вы не хотите изменять свой PATH, вы можете вместо этого выполнить команду, используя ее абсолютный путь: ~ / bin / Ожидайте [аргументы] Не забудьте установить его исполняемый бит: chmod + x ~ / bin /
hope

6

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

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


1
Это на самом деле будет работать для su. suне имеет опции -S (stdin).
AUS

Можно ли избежать сна и использовать что-то более надежное?
Михаил Панков

6

Посмотрите на expectутилиту Linux.

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


1

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


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

Если вы можете войти как пользователь с помощью ключа ssh, для доступа sudo все в порядке: ssh -t user @ host "echo mypassword | sudo -S sudocommand"
Джек,

0

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


0

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

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

0

лучшая 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 и другие решения.


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

Это работает


1
Это единственный, который работает для меня в Fedora. Люди понижают ответы только потому, что они не работают в их ситуации?
Hangchen Yu

2
«su: должен быть запущен из терминала» (RPi1B, Raspbian)
notme1560

К сожалению, этого нет в последних версиях su, которые вместо этого считывают пароль из stdio .
moutonjr

-1

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


-1

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


-1

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

echo password | sudo command

Пример:

echo password | sudo apt-get update; whoami

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


-2

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


-11
su -c "Command" < "Password"

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


1
Это не. «su: должен быть запущен из терминала» является ответом на это.
thelogix
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.