Linux

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

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

echo password | ssh id@server

 

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

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

 

Ответ 1

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

 

Ответ 2

$ sudo apt-get install sshpass

$ sshpass -p your_password ssh user@hostname

 

Ответ 3

Хотя правильный ответ на ваш вопрос - sshpass. Вы находитесь всего в трех простых шагах от решения:

Все следующие команды выполняются на стороне клиента, то есть на вашем компьютере.

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

# ssh-keygen

 

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

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

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

# ssh-copy-id userid@hostname

 

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

# ssh userid@hostname

 

Ответ 4

Используйте следующие команды:

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

 

Добро пожаловать в Ubuntu!

 

Ответ 5

Единый вход 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.

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

# Устновка вашего пароля в переменные среды

 export SSHPASS='my_secret_password'

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

Аутентификация с открытым ключом 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

 

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

 

Ответ 6

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

plink user@domain -pw mypass  [cmd]

 

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

 

Ответ 7

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

 

Ответ 8

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

Если это не подходит, я бы предложил Expect.

Схожие статьи

Linux

Архитектура для высокодоступного MySQL с автоматическим обходом отказа в физически разных местах

Linux

Почему происходит высокая загрузка ЦП при низкой средней нагрузке?

Linux

Как предоставить доступ нескольким системным администраторам Linux, работающим от имени пользователя root?

Linux

Имеет ли смысл включать автоматическое обновление в стабильной версии Debian lenny?