Назад | Перейти на главную страницу

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

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

ex)

echo password | ssh id@server

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

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

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

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

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

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

Хотя правильный ответ на ваш вопрос - sshpass (подробнее см. другой ответ) есть более безопасный способ - ключи SSH. Ты просто три простых шага вдали от решения:

Введите следующую команду, чтобы начать создание rsa keypair:

# ssh-keygen

Когда появится сообщение «Введите файл, в котором нужно сохранить ключ», просто оставьте имя файла пустым, нажав Enter.

Когда терминал попросит вас ввести кодовую фразу, просто оставьте это поле пустым и нажмите Enter.

Затем скопируйте пару ключей на сервер с помощью одна простая команда:

# ssh-copy-id userid@hostname

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

# ssh userid@hostname

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

#!/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

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

plink user@domain -pw mypass  [cmd]

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

Это может быть бесполезно для вас, но вы можете сделать это с помощью 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! $!";

Единый вход SSH обычно достигается с помощью аутентификации с открытым ключом и агента аутентификации. Вы можете легко добавить свой тестовый ключ виртуальной машины к существующему агенту аутентификации (см. Пример ниже). Существуют и другие методы, такие как 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, возможно, проще с языками программирования. Другой процесс может подключиться к вашему pipe / fd до того, как будет записан пароль. Окно возможностей довольно короткое и ограничивается вашими процессами или root.

Переменная окружения

# 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=). Окно возможностей намного больше, но по-прежнему ограничено вашими собственными процессами или root, а не другими пользователями.

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

 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

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

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

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

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

я предпочитаю passh https://github.com/clarkwang/passh

sshpass нарушен намеренно.

когда ssh-сервер еще не добавлен в мой known_hosts, sshpass не будет показывать мне сообщение о добавлении сервера к моим известным хостам, passh нет этой проблемы.

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

$ passh -p password ssh user@host