Как автоматизировать вход по 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, но они более сложные.
В ситуациях, когда password
это единственный доступный метод аутентификации, 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
и поставьте перед важными командами пробел. Они не сохранятся в истории.
# 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
Кодовая фраза очень важна. Любой, кто каким-то образом получит файл закрытого ключа, не сможет использовать его без парольной фразы.
# 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