Як автоматизувати вхід в SSH за допомогою пароля?


419

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

колишній)

echo password | ssh id@server

Це не працює.

Я пам’ятаю, що я робив це за допомогою деяких хитрощів, які хтось мене керував, але зараз не можу згадати трюк, яким я користувався ...


2
FreeBSD не приймає ключі без пароля. Не спокушайтесь. Однак деякі сервери Linux прийняли це. Я вважаю, що сервер Linux був неправильно налаштований.
Еоніл

16
Це справедливе питання. Наприклад, я хочу дозволити користувачеві ввести пароль, а потім увійти на іншу машину, використовуючи його. Не можу припустити, що ключі ssh будуть розподілені по всіх наших машинах. Наведені нижче відповіді поки що не допомагають цій ситуації.
dfrankow


Дуже важливе питання. Мені також потрібна відповідь, мій провайдер веб-просторів блокує розміщення ключів на сервері, тому я повинен передавати паспорт без ключів.
Radon8472

Відповіді:


382

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

Якщо у вас вже є ключ 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якщо ви хочете спробувати зберегти свої ключі захищеними парольною фразою.


14
Нарешті я вирішив використовувати ключові пари. Тому що я зрозумів, що це найпростіший спосіб.
Еоніл

9
@Eonil: Не спокушайтеся користуватися клавішами без пропускної фрази. Дізнайтеся, як користуватися ssh-агентом або тестуванням.
користувач619714

119
Це хороша відповідь, але не правильна відповідь на питання.
Джон Хант

74
Такі відповіді дійсно мене дуже дратують. Це не було питання. Ніхто не запитував, як використовувати пари ключів.
Метт Флетчер

16
Це не дає відповіді на запитання. Це гарна відповідь на зовсім інше питання, але для того, хто задається, це страшно.
srchulo

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

51
Так, іноді ви не можете використовувати auth на основі ключів з різних причин .. Наприклад, зараз я не можу використовувати кеяут на сервері plesk, оскільки у вікні це не ввімкнено, і у мене немає root.
Джон Хант

17
+1! В якості бічної записки sshперед використанням потрібно запустити звичайний раз sshpass, щоб підтвердити відбиток RSA
user123444555621

21
-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

1
Відмінно працює зі значеннями за замовчуванням. Використання ~ / rsa4live.pub не працювало для мене при спробі ssh-copy-id.
Cees Timmerman

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

2
Він працював, але не може надрукувати stdout віддаленої машини.
Еоніл

він працює добре для деяких машин, не може поставити ключ заздалегідь, оскільки IP-адреса змінюється щоразу.
larrycai

4
добре буде додати -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/nullкоманду ssh, щоб уникнути прийняття машини у
відомі_хости

B .. b але mh ssh ключі ...
Damien Ó 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, і синтаксис здебільшого сумісний із відкритим клієнтом.


Для Windows ваша відповідь хороша, неслухняно користувач Linux / unix, як правило, не
замикається

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, можливо, простіше з мовами програмування. Інший процес може приєднатися до pipe / 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

Це зручно, але менш безпечно, як описано на сторінці man. Аргументи командного рядка видно всім користувачам (наприклад 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

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


8

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


3
Використання SSH-ключів без пароля лише дещо безпечніше, ніж використання паролів у файлі.
юнзен

10
@yunzen Неправильно. Аутентифікація ключа захищає вас від mitm-атак, навіть якщо ви не знаєте ключ хоста. Зловмисник може представити себе за сервер, але ніколи не підключатися до реального сервера. При автентифікації пароля будь-який сервер, до якого ви підключитесь (законний чи ні), побачить пароль. З цих причин ключ ssh без пароля набагато безпечніший, ніж просто зберігання пароля у файлі.
kasperd

14
Це не відповідь.
Стів Беннетт

@SteveBennett Це те саме, що прийняла відповідь і була розміщена перед нею, хоча вона містить менше деталей.
Майкл Хемптон

3
Ну, я б сказав, що прийнята відповідь - це гідна відповідь на питання, яке не було задано. Це не що-небудь.
Стів Беннетт

4

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

Якщо це не підходить, я б запропонував очікувати, як це запропоновано в іншій відповіді.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.