Как автоматизировать вход по SSH с паролем?


420

Как автоматизировать вход по SSH с паролем? Я настраиваю свою тестовую ВМ, поэтому строгая безопасность не рассматривается. SSH выбран для приемлемой безопасности с минимальной конфигурацией.

ех)

echo password | ssh id@server

Это не работает

Я помню, я делал это с некоторыми уловками, которые кто-то направлял меня, но я не могу вспомнить уловку, которую я использовал ...


2
FreeBSD не принимает ключи без пароля. Не поддавайтесь искушению. Однако некоторые серверы Linux приняли это. Я считаю, что сервер Linux был неправильно настроен.
— Эонил

16
Это правильный вопрос. Например, я хочу разрешить пользователю вводить пароль, а затем входить на другой компьютер, используя его. Я не могу предположить, что ssh-ключи будут распространяться на все наши машины. Приведенные ниже ответы пока не помогают в этой ситуации.
— 12:30


Очень важный вопрос Мне тоже нужен ответ, мой поставщик веб-пространства блокирует размещение файлов ключей на сервере, поэтому я должен передать пароль без ключевых файлов.
— Radon8472

Ответы:


384

Не используйте пароль. Сгенерируйте SSH-ключ без пароля и отправьте его на виртуальную машину.

Если у вас уже есть ключ SSH, вы можете пропустить этот шаг ... Просто нажмите Enterдля ключа и обеих паролей:

$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.ssh/id_rsa.pub.

Скопируйте ключи на целевой сервер:

$ ssh-copy-id id@server
id@server's password: 

Теперь попробуйте войти в систему с помощью ssh 'id@server'и проверить:

.ssh/authorized_keys

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

Наконец, проверьте вход в систему ...

$ ssh id@server

id@server:~$ 

Вы также можете захотеть использовать его, ssh-agentесли хотите защитить свои ключи парольной фразой.


14
Я наконец решил использовать пары ключей. Потому что я понял, что это самый простой способ.
— Eonil

9
@Eonil: не поддавайтесь искушению использовать ключи без пароля. Узнайте, как использовать ssh-agent или pageant.
— user619714

121
Это хороший ответ, но не правильный ответ на вопрос.
— Джон Хант

76
Такие ответы действительно, действительно раздражают меня. Это был не вопрос. Никто не спрашивал, как использовать пары ключей.
— Мэтт Флетчер

16
Это не отвечает на вопрос. Это хороший ответ на совершенно другой вопрос, но он ужасен для того, кто его задал.
— срчуло

596
$ sudo apt-get install sshpass
$ sshpass -p your_password ssh user@hostname

51
Да, иногда вы не можете использовать аутентификацию на основе ключей по разным причинам ... например, сейчас я не могу использовать keyauth на сервере plesk, потому что он не включен и у меня нет root.
— Джон Хант

17
+1! Как примечание стороны, вам нужно запустить sshодин раз перед использованием sshpass, чтобы подтвердить отпечаток пальца RSA
— user123444555621

22
-1 за необходимость использовать пароль в команде. Это записывает пароль .bash_historyв виде простого текста на вашем компьютере.

15
@MisterDood Вы можете запустить history -rпосле команды, чтобы стереть вашу историю. Хороший вопрос, хотя.
— NuclearPeon

20
Совет для профессионалов: если вы не хотите, чтобы в .bash_history отображалась конкретная команда, добавьте к ней пробел. Это просто работает. Однако пользователи этой команды должны быть более обеспокоены тем, что непривилегированные пользователи в системе могут видеть полную командную строку с ps, которая, конечно, включает в себя пароль. Поскольку ssh-сессии имеют тенденцию быть долгоживущими, это проблема безопасности.
— CubicleSoft

71

В то время как правильный ответ на ваш вопрос - sshkey , есть более безопасный способ - ключи SSH. Вы только три шага от решения:

Создайте пару ключей RSA :

# ssh-keygen

затем скопируйте его на сервер одной простой командой :

# ssh-copy-id userid@hostname

Теперь вы можете войти без пароля :

# ssh userid@hostname

1
Работает нормально со значениями по умолчанию. Использование ~ / rsa4live.pub не помогло мне при попытке ssh-copy-id.
— Сис Тиммерман

1
Если вы хотите, чтобы эти шаги работали для другого пользователя, 1. ssh-keygen 2. ssh-copy-id nazir @ hostname 3. ssh nazir @ hostname
— Venfah Nazir

2
Для меня это былоssh-copy-id -i ~/.ssh/tatu-key-ecdsa user@host
— Габриэль Ярмарка

21
Это не ответ на вопрос.
— Стив Беннетт

2
А также? Ответ выше, sshpass ...
— lzap

40

Используйте ожидайте:

#!/usr/bin/expect -f
#  ./ssh.exp password 192.168.1.11 id
set pass [lrange $argv 0 0]
set server [lrange $argv 1 1]
set name [lrange $argv 2 2]

spawn ssh $name@$server
match_max 100000
expect "*?assword:*"
send -- "$pass\r"
send -- "\r"
interact

Пример:

# ./1.ex password localhost ooshro
spawn ssh ooshro@localhost
ooshro@localhost's password: 
Linux ubuntu-1010-server-01 2.6.35-25-generic-pae #44-Ubuntu SMP Fri Jan 21 19:01:46 UTC 2011 i686 GNU/Linux
Ubuntu 10.10

Welcome to Ubuntu!
 * Documentation:  https://help.ubuntu.com/
Last login: Tue Mar  1 12:41:12 2011 from localhost

2
Это сработало, но не может распечатать стандартный вывод удаленной машины.
— Eonil

это работает хорошо для некоторой машины, которая не может поставить ключ заранее, так как IP-адрес изменяется каждый раз.
— Ларричай

4
также будет полезно добавить -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/nullкоманду ssh, чтобы избежать принятия машины в known_hosts
— larrycai

B .. б, но MUH SSH ключи ...
— Дэмиен Ó Ceallaigh

Более подробный пример этого скрипта вы можете найти по адресу: linuxaria.com/howto/…. Эти примеры здесь также должны работать с удаленными командами
— Radon8472

16

Это может быть бесполезно для вас, но вы можете сделать это с помощью Perl:

\#!/usr/bin/perl  
use warnings;  
use strict;  

use Net::SSH::Perl;  
my $host = 'remote.serv.er';  
my $user = 'root';  
my $pass = 'hunter2';  
my $ssh = Net::SSH::Perl->new('$host');  
$ssh->login('$user', '$pass') or die "Oh noes! $!";

2
Кроме того, вы можете делать с этим Ruby github.com/net-ssh/net-ssh
— EnabrenTane

15

Я удивлен, что никто не упомянул plinkиз putty-toolsпакета в Ubuntu:

plink user@domain -pw mypass  [cmd]

Он также доступен в Windows, и его синтаксис в основном совместим с клиентом openssh.


Для Windows ваш ответ хороший, к сожалению, пользователи linux / unix обычно не имеют
— plink

2
это в putty-toolsпакете
— eadmaster

10

Единая регистрация SSH обычно достигается с помощью аутентификации с открытым ключом и агента аутентификации. Вы можете легко добавить свой тестовый ключ VM к существующему агенту аутентификации (см. Пример ниже). Существуют и другие методы, такие как gssapi / kerberos, но они более сложны.

sshpass

В ситуациях, когда passwordдоступен только один способ аутентификации, sshpass может использоваться для автоматического ввода пароля. Пожалуйста, обратите особое внимание на раздел « Безопасность » на странице руководства . Во всех трех вариантах пароль виден или хранится в незашифрованном виде в какой-то момент :

Анонимный канал (рекомендуется sshpass)

# Create a pipe
PIPE=$(mktemp -u)
mkfifo -m 600 $PIPE
# Attach it to file descriptior 3
exec 3<>$PIPE
# Delete the directory entry
rm $PIPE
# Write your password in the pipe
 echo 'my_secret_password' >&3
# Connect with sshpass -d
sshpass -d3 ssh user@host

# Close the pipe when done
exec 3>&-

Это довольно громоздко в bash, возможно, проще с языками программирования. Другой процесс может подключиться к вашему каналу / fd до того, как будет написан пароль. Окно возможностей довольно короткое и ограничено вашими процессами или корнем.

Переменная среды

# Set your password in an environment variable
 export SSHPASS='my_secret_password'
# Connect with sshpass -e
sshpass -e ssh user@host

Вы и пользователь root можете читать переменные окружения вашего процесса (т. Е. Ваш пароль) во время работы sshpass ( cat /proc/<pid>/environ | tr '\0' '\n' | grep ^SSHPASS=). Окно возможностей намного длиннее, но все еще ограничено вашими собственными процессами или корнем, а не другими пользователями.

Аргумент командной строки (наименее безопасный)

 sshpass -p my_secret_password ssh user@host

Это удобно, но менее безопасно, как описано на странице руководства. Аргументы командной строки видны всем пользователям (например ps -ef | grep sshpass). sshpass пытается скрыть аргумент, но все равно есть окно, в котором все пользователи могут видеть ваш пароль, переданный по аргументу.

Примечание

Задайте для переменной bash HISTCONTROL значение ignorespaceили ignorebothи добавьте к своим чувствительным командам пробел. Они не будут сохранены в истории.


SSH аутентификация с открытым ключом

# Generate a key pair
# Do NOT leave the passphrase empty
ssh-keygen
# Copy it to the remote host (added to .ssh/authorized_keys)
ssh-copy-id user@host

Пароль очень важен. Любой, кто получит файл с закрытым ключом, не сможет использовать его без ключевой фразы.

Настройте агент аутентификации SSH

# Start the agent
eval `ssh-agent`
# Add the identity (private key) to the agent
ssh-add /path/to/private-key
# Enter key passphrase (one time only, while the agent is running)

Подключите как обычно

ssh user@host

Преимущество заключается в том, что ваш закрытый ключ зашифрован, и вам нужно ввести его пароль только один раз (с помощью более безопасного метода ввода).


8

Вы уверены, что не хотите использовать ключи SSH, а не пароли? Таким образом, это безопасно и автоматически.


3
Использование ключей SSH без пароля только немного более безопасно, чем использование паролей в файле.
— Юнзен

10
@yunzen Неверно. Аутентификация по ключу защищает вас от митм-атак, даже если вы не знаете ключ хоста. Злоумышленник может выдать себя за сервер, но никогда не подключиться к реальному серверу. При аутентификации по паролю любой сервер, к которому вы подключаетесь (законный или нет), увидит пароль. По этим причинам ключ ssh без пароля намного безопаснее, чем просто сохранение пароля в файле.
— Касперд

14
Это не ответ.
— Стив Беннетт

@SteveBennett Он такой же, как принятый ответ, и был опубликован до него, хотя в нем меньше деталей.
— Майкл Хэмптон

3
Ну, я бы сказал, что принятый ответ - достойный ответ на вопрос, который не был задан. Это не что-нибудь.
— Стив Беннет

4

В зависимости от ваших потребностей в автоматизации, возможно, Ansible подойдет для вас. Он может прекрасно управлять такими вещами, как запрос пароля, запрос пароля sudo, различные способы изменения использования, безопасное использование зашифрованных секретов (хранилище).

Если это не подходит, я бы предложил Expect, как предложено в другом ответе.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.