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

420

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

ех)

echo password | ssh id@server

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

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

Eonil
источник
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если хотите защитить свои ключи парольной фразой.

Cakemox
источник
14
Я наконец решил использовать пары ключей. Потому что я понял, что это самый простой способ.
Eonil
9
@Eonil: не поддавайтесь искушению использовать ключи без пароля. Узнайте, как использовать ssh-agent или pageant.
user619714
121
Это хороший ответ, но не правильный ответ на вопрос.
Джон Хант
76
Такие ответы действительно, действительно раздражают меня. Это был не вопрос. Никто не спрашивал, как использовать пары ключей.
Мэтт Флетчер
16
Это не отвечает на вопрос. Это хороший ответ на совершенно другой вопрос, но он ужасен для того, кто его задал.
срчуло
596
$ sudo apt-get install sshpass
$ sshpass -p your_password ssh user@hostname
weekens
источник
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
lzap
источник
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
ooshro
источник
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.

eadmaster
источник
Для 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

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

nrolans
источник
8

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

Coops
источник
3
Использование ключей SSH без пароля только немного более безопасно, чем использование паролей в файле.
Юнзен
10
@yunzen Неверно. Аутентификация по ключу защищает вас от митм-атак, даже если вы не знаете ключ хоста. Злоумышленник может выдать себя за сервер, но никогда не подключиться к реальному серверу. При аутентификации по паролю любой сервер, к которому вы подключаетесь (законный или нет), увидит пароль. По этим причинам ключ ssh без пароля намного безопаснее, чем просто сохранение пароля в файле.
Касперд
14
Это не ответ.
Стив Беннетт
@SteveBennett Он такой же, как принятый ответ, и был опубликован до него, хотя в нем меньше деталей.
Майкл Хэмптон
3
Ну, я бы сказал, что принятый ответ - достойный ответ на вопрос, который не был задан. Это не что-нибудь.
Стив Беннет
4

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

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

Кэмерон Керр
источник