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

Взломан сервер – что делать?

Linux

Определение переменной с экспортом или без него

Linux

Может ли scp рекурсивно копировать каталоги?

Linux

Как сделать так, чтобы дочерний процесс завершался после завершения родительского