Bagaimana cara mengotomatiskan login SSH dengan kata sandi?


419

Bagaimana cara mengotomatiskan login SSH dengan kata sandi? Saya mengkonfigurasi VM pengujian saya, jadi keamanan yang berat tidak dipertimbangkan. SSH dipilih untuk keamanan yang dapat diterima dengan konfigurasi minimal.

ex)

echo password | ssh id@server

Ini tidak bekerja

Saya ingat saya melakukan ini dengan beberapa trik seseorang membimbing saya, tetapi saya tidak ingat sekarang trik yang saya gunakan ...


2
FreeBSD tidak menerima kunci tanpa kata sandi. Jangan tergoda. Namun beberapa server Linux menerimanya. Saya percaya server Linux salah konfigurasi.
Eonil

16
Ini pertanyaan yang valid. Misalnya, saya ingin mengizinkan pengguna memasukkan kata sandi, lalu masuk ke komputer lain yang menggunakannya. Saya tidak dapat berasumsi bahwa akan ada kunci ssh yang didistribusikan di semua mesin kami. Jawaban di bawah sejauh ini tidak membantu situasi ini.
dfrankow


Pertanyaan yang sangat penting Saya perlu jawaban juga, penyedia ruang web saya memblokir untuk meletakkan keyfile di server, jadi saya harus melewati passwort tanpa keyfiles.
Radon8472

Jawaban:


382

Jangan gunakan kata sandi. Hasilkan kunci SSH tanpa kata sandi dan dorong ke VM Anda.

Jika Anda sudah memiliki kunci SSH, Anda dapat melewati langkah ini ... Cukup tekan Enteruntuk kunci dan kedua frasa sandi:

$ 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.

Salin kunci Anda ke server target:

$ ssh-copy-id id@server
id@server's password: 

Sekarang coba masuk ke mesin, dengan ssh 'id@server', dan check in:

.ssh/authorized_keys

untuk memastikan kami belum menambahkan kunci tambahan yang tidak Anda harapkan.

Akhirnya periksa masuk ...

$ ssh id@server

id@server:~$ 

Anda juga mungkin ingin melihat ke dalam menggunakan ssh-agentjika Anda ingin mencoba menjaga kunci Anda dilindungi dengan frasa sandi.


14
Saya akhirnya memutuskan menggunakan pasangan kunci. Karena saya menyadari itu cara yang paling sederhana.
Eonil

9
@Eonil: Jangan tergoda untuk menggunakan kunci tanpa frasa sandi. Pelajari cara menggunakan ssh-agent atau pageant.
user619714

119
Ini adalah jawaban yang baik, tetapi bukan jawaban yang benar untuk pertanyaan itu.
John Hunt

74
Jawaban semacam ini benar-benar mengganggu saya. Itu bukan pertanyaannya. Tidak ada yang bertanya bagaimana menggunakan pasangan kunci.
Matt Fletcher

16
Ini tidak menjawab pertanyaan. Ini adalah jawaban yang bagus untuk pertanyaan yang sama sekali berbeda, tetapi itu mengerikan bagi yang ditanya.
srchulo

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

51
Yup, kadang-kadang Anda tidak dapat menggunakan auth berbasis kunci karena berbagai alasan .. misalnya saat ini saya tidak dapat menggunakan keyauth pada server plesk karena di luar kotak itu tidak diaktifkan dan saya tidak memiliki root.
John Hunt

17
+1! Sebagai catatan tambahan, Anda perlu menjalankan perintah sshsatu kali sebelum menggunakan sshpass, untuk mengonfirmasi sidik jari RSA
user123444555621

21
-1 karena harus menggunakan kata sandi dalam perintah. Ini mencatat kata sandi di .bash_historydalam teks biasa di mesin Anda.

15
@MisterDood Anda bisa menjalankan history -rperintah untuk menghapus riwayat Anda. Poin yang bagus.
NuclearPeon

20
Kiat pro: Jika Anda tidak ingin perintah tertentu ditampilkan di .bash_history, awali perintah dengan spasi. Itu hanya bekerja. Namun, pengguna perintah ini harus lebih khawatir bahwa pengguna yang tidak memiliki hak istimewa pada sistem dapat melihat baris perintah penuh dengan ps, yang, tentu saja, memasukkan kata sandi. Karena sesi ssh cenderung berumur panjang, ini adalah masalah keamanan.
CubicleSoft

71

Sementara jawaban yang benar untuk pertanyaan Anda adalah sshkey , ada cara yang lebih aman - kunci SSH. Anda hanya tiga langkah mudah dari solusi:

Buat rsa keypair :

# ssh-keygen

lalu salin di server dengan satu perintah sederhana :

# ssh-copy-id userid@hostname

Anda sekarang dapat masuk tanpa kata sandi :

# ssh userid@hostname

1
Berfungsi dengan baik dengan nilai default. Menggunakan ~ / rsa4live.pub tidak berfungsi untuk saya ketika mencoba ssh-copy-id.
Cees Timmerman

1
Jika Anda ingin langkah-langkah ini bekerja untuk pengguna yang berbeda, 1. ssh-keygen 2. ssh-copy-id nazir @ hostname 3. ssh nazir @ hostname
Venfah Nazir

2
Bagi saya itussh-copy-id -i ~/.ssh/tatu-key-ecdsa user@host
Gabriel Fair

21
Ini bukan jawaban untuk pertanyaan itu.
Steve Bennett

2
Dan? Jawabannya di atas, sshpass ...
lzap

40

Gunakan harapkan:

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

Contoh:

# ./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
Ini bekerja tetapi tidak bisa mencetak stdout mesin jarak jauh.
Eonil

itu bekerja dengan baik untuk beberapa mesin tidak dapat membuat kunci di muka karena alamat IP berubah setiap kali.
larrycai

4
akan lebih baik untuk menambahkan -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/nullperintah ssh juga untuk menghindari menerima mesin ke known_hosts
larrycai

B .. b tapi kunci muh ssh ...
Damien Ó Ceallaigh

Contoh yang lebih terperinci dari skrip ini dapat Anda temukan di: linuxaria.com/howto/... Contoh ini di sini juga dapat digunakan dengan perintah jarak jauh
Radon8472

16

Ini mungkin tidak ada gunanya bagi Anda, tetapi Anda bisa melakukannya dengan 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
Demikian juga, Anda dapat melakukannya dengan Ruby ini github.com/net-ssh/net-ssh
EnabrenTane

15

Saya terkejut tidak ada yang disebutkan plinkdari putty-toolspaket di Ubuntu:

plink user@domain -pw mypass  [cmd]

Ini juga tersedia di Windows dan sintaksisnya sebagian besar kompatibel dengan klien openssh.


Untuk windows, jawaban Anda bagus, biasanya pengguna linux / unix tidak punya plink
Radon8472

2
itu ada dalam putty-toolspaket
eadmaster

10

Sistem masuk tunggal SSH biasanya dicapai dengan otentikasi kunci publik dan agen otentikasi. Anda dapat dengan mudah menambahkan kunci VM pengujian Anda ke agen auth yang ada (lihat contoh di bawah). Metode lain seperti gssapi / kerberos ada tetapi lebih kompleks.

sshpass

Dalam situasi di mana passwordhanya metode otentikasi yang tersedia, sshpass dapat digunakan untuk memasukkan kata sandi secara otomatis. Harap perhatikan bagian PERTIMBANGAN KEAMANAN di halaman manual . Dalam ketiga opsi, kata sandi terlihat atau disimpan dalam plaintext di beberapa titik :

Pipa anonim (direkomendasikan oleh 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>&-

Ini cukup rumit di bash, bisa dibilang lebih mudah dengan bahasa pemrograman. Proses lain dapat dilampirkan ke pipa Anda / fd sebelum kata sandi ditulis. Jendela peluang cukup pendek dan terbatas pada proses atau root Anda.

Variabel lingkungan

# Set your password in an environment variable
 export SSHPASS='my_secret_password'
# Connect with sshpass -e
sshpass -e ssh user@host

Anda dan root dapat membaca variabel lingkungan proses Anda (yaitu kata sandi Anda) ketika sshpass sedang berjalan ( cat /proc/<pid>/environ | tr '\0' '\n' | grep ^SSHPASS=). Jendela peluang jauh lebih lama tetapi masih terbatas pada proses atau root Anda sendiri, bukan pengguna lain.

Argumen baris perintah (paling tidak aman)

 sshpass -p my_secret_password ssh user@host

Ini nyaman tetapi kurang aman seperti yang dijelaskan dalam halaman manual. Argumen baris perintah terlihat oleh semua pengguna (misalnya ps -ef | grep sshpass). sshpass mencoba menyembunyikan argumen, tetapi masih ada jendela di mana semua pengguna dapat melihat kata sandi Anda dilewati oleh argumen.

Catatan samping

Setel variabel HISTCONTROL bash Anda ke ignorespaceatau ignorebothdan awali perintah sensitif Anda dengan spasi. Mereka tidak akan disimpan dalam sejarah.


Otentikasi kunci publik 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

Frasa sandi sangat penting. Siapa pun yang mendapatkan file kunci privat tidak akan dapat menggunakannya tanpa frasa sandi.

Atur agen otentikasi 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)

Terhubung seperti biasa

ssh user@host

Keuntungannya adalah kunci pribadi Anda dienkripsi dan Anda hanya perlu memasukkan frasa sandi satu kali (melalui metode input yang lebih aman juga).


8

Tentu Anda tidak ingin menggunakan kunci SSH daripada kata sandi? Dengan begitu keduanya aman dan otomatis.


3
Menggunakan kunci SSH tanpa kata sandi hanya sedikit lebih aman daripada menggunakan kata sandi dalam file.
yunzen

10
@yunzen salah. Otentikasi kunci melindungi Anda dari serangan mitm bahkan jika Anda tidak tahu kunci host. Seorang penyerang bisa menyamar sebagai server, tetapi tidak pernah terhubung ke server yang sebenarnya. Dengan otentikasi kata sandi, server mana pun yang terhubung dengan Anda (sah atau tidak) akan melihat kata sandi tersebut. Karena alasan itu, kunci ssh tanpa kata sandi jauh lebih aman daripada hanya menyimpan kata sandi dalam file.
kasperd

14
Ini bukan jawaban.
Steve Bennett

@SteveBennett Ini sama dengan jawaban yang diterima dan diposting sebelumnya, meskipun kurang detail.
Michael Hampton

3
Yah, saya akan mengatakan jawaban yang diterima adalah jawaban yang layak untuk pertanyaan yang tidak ditanyakan. Ini bukan apa-apa.
Steve Bennett

4

Tergantung pada kebutuhan otomasi Anda, mungkin Ansible akan cocok untuk Anda. Ini dapat dengan baik mengelola hal-hal seperti meminta kata sandi, meminta kata sandi sudo, berbagai cara mengubah penggunaan, dengan aman menggunakan rahasia terenkripsi (vault).

Jika itu tidak cocok, saya akan menyarankan Harapkan, seperti yang disarankan dalam jawaban lain.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.