Parola ile SSH girişini nasıl otomatikleştirebilirim?


419

Parola ile SSH girişini nasıl otomatikleştirebilirim? Test VM'mi yapılandırıyorum, bu nedenle ağır güvenlik dikkate alınmıyor. SSH, minimum konfigürasyon ile kabul edilebilir güvenlik için seçildi.

ex)

echo password | ssh id@server

Bu işe yaramıyor.

Birinin bana rehberlik ettiği bazı numaralarla bunu yaptığımı hatırlıyorum, ama şimdi kullandığım numarayı hatırlayamıyorum.


2
FreeBSD şifresiz anahtarları kabul etmedi. Baştan çıkarma. Ancak bazı Linux sunucuları kabul etti. Linux sunucusunun yanlış yapılandırıldığına inanıyorum.
Eonil

16
Bu geçerli bir soru. Örneğin, bir kullanıcının bir şifre girmesine izin vermek, ardından onu kullanarak başka bir makineye giriş yapmak istiyorum. Tüm makinelerimize dağıtılmış ssh anahtarlarının olacağını varsayamıyorum. Şimdiye kadarki cevaplar bu duruma yardımcı olmuyor.
dfrankow


Çok önemli bir soru. Benim de bir cevaba ihtiyacım var, web alanı sağlayıcım sunucuya anahtar dosyaları yerleştirmeyi engelliyor, bu yüzden anahtar geçidi olmadan anahtar geçidini geçirmem gerekiyor.
Radon8472

Yanıtlar:


382

Şifre kullanmayın. Parolasız bir SSH anahtarı oluşturun ve VM'nize gönderin.

Zaten bir SSH anahtarınız varsa, bu adımı atlayabilirsiniz ... Sadece Enteranahtar ve her iki parola için de vurun:

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

Anahtarlarınızı hedef sunucuya kopyalayın:

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

Şimdi, makineye giriş yapmayı deneyin ssh 'id@server've şunu kontrol edin:

.ssh/authorized_keys

Beklemediğiniz ekstra anahtarlar eklemediğimizden emin olmak için.

Sonunda giriş kontrol edin ...

$ ssh id@server

id@server:~$ 

Ayrıca ssh-agent, anahtarlarınızı bir parola ile korumalı tutmayı denemek istiyorsanız, bunu kullanmayı da isteyebilirsiniz .


14
Sonunda anahtar çiftleri kullanmaya karar verdim. Çünkü bunun en basit yol olduğunu anladım.
Eonil

9
@Eonil: Anahtarları geçiş cümlesi olmadan kullanmaktan kaçının. Ssh-agent veya pageant'un nasıl kullanılacağını öğrenin.
user619714

119
Bu iyi bir cevap, ancak sorunun doğru cevabı değil.
John Hunt,

74
Bu tür cevaplar beni gerçekten çok rahatsız ediyor. Soru bu değildi. Hiç kimse anahtar çiftlerinin nasıl kullanılacağını sormadı.
Matt Fletcher,

16
Bu soruya cevap vermiyor. Tamamen farklı bir soru için iyi bir cevap, ancak sorulan için korkunç.
srchulo

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

51
Evet, bazen çeşitli nedenlerden dolayı anahtar tabanlı auth kullanamazsınız .. örneğin şu anda bir plesk sunucusunda keyauth kullanamıyorum çünkü kutu etkin değil ve benim köküm yok.
John Hunt,

17
1! Bir yandan not olarak, RSA parmak izini onaylamak için sshkullanmadan önce bir kez düz sshpass
koşmanız gerekir

21
Komutta şifreyi kullanmak zorunda olduğunuz için -1. Bu, parolanızı .bash_historymakinenizdeki düz metin olarak kaydeder .

15
@MisterDood Geçmişinizi history -rsilmek için komuttan sonra koşabilirsiniz . Yine de iyi nokta.
NuclearPeon

20
Profesyonel ipucu: .bash_history'de belirli bir komutun görünmesini istemiyorsanız, komutu bir boşluk ile önekleyin. Sadece işe yarıyor. Bununla birlikte, bu komutun kullanıcıları, sistemdeki ayrıcalıklı olmayan kullanıcıların elbette şifreyi içeren ps komutunun tam satırını görebileceklerinden daha fazla endişe duymalıdırlar. Ssh oturumları uzun ömürlü olma eğiliminde olduğundan, bu bir güvenlik sorunudur.
CubicleSoft

71

Sorunuz için doğru cevap sshkey olsa da, daha güvenli bir yol var - SSH anahtarları. Çözümden sadece üç kolay adım uzaktasınız:

Bir rsa keypair oluşturun :

# ssh-keygen

sonra basit bir komutla sunucuya kopyalayın :

# ssh-copy-id userid@hostname

şimdi şifre olmadan giriş yapabilirsiniz :

# ssh userid@hostname

1
Varsayılan değerlerle iyi çalışır. Deneme sırasında ~ / rsa4live.pub kullanmak benim için işe yaramadı ssh-copy-id.
Cees Timmerman

1
Bu adımların farklı kullanıcılar için çalışmasını istiyorsanız, 1. ssh-keygen 2. ssh-copy-id nazir @ hostname 3. ssh nazir @ hostname
Venfah Nazir

2
Benim için öyleydissh-copy-id -i ~/.ssh/tatu-key-ecdsa user@host
Gabriel Fuarı

21
Bu sorunun cevabı değil.
Steve Bennett

2
Ve? Cevap yukarıda, sshpass ...
17'de

40

Beklentiyi kullanın:

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

Örnek:

# ./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
Çalıştı ancak uzak makinenin stdout'unu yazdıramıyor.
Eonil

IP adresi her zaman değiştirildiğinden bazı makinelerin anahtarı önceden koyamaması için iyi çalışıyor.
larrycai

4
-oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/nullMakineyi known_hosts içine
almaktan

B .. b ama muh ssh tuşları ...
Damien Ó Ceallaigh

Bu betiğin daha ayrıntılı bir örneğini şurada bulabilirsiniz: linuxaria.com/howto/… Buradaki örnekler de uzaktan komutlarla birlikte çalışmalıdır
Radon8472 11:18

16

Bu size yararı olmayabilir, ama Perl ile yapabilirsiniz:

\#!/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
Aynı şekilde, bu Ruby ile yapabilirsiniz github.com/net-ssh/net-ssh
EnabrenTane

15

Bahsettiğim sürpriz kimse değilim plinkdan putty-toolsUbuntu paketinde:

plink user@domain -pw mypass  [cmd]

Ayrıca Windows'ta da kullanılabilir ve sözdizimi çoğunlukla openssh istemcisiyle uyumludur.


Windows için cevabınız iyidir, unfurtunally linux / unix kullanıcısı genelde plink kullanmazlar
Radon8472

2
içinde bulunduğu putty-toolspaket
eadmaster

10

SSH tekli oturum açma genellikle ortak anahtar kimlik doğrulaması ve bir kimlik doğrulama aracısı ile gerçekleştirilir. Test VM anahtarınızı mevcut bir auth agent'a kolayca ekleyebilirsiniz (aşağıdaki örneğe bakın). Gssapi / kerberos gibi diğer yöntemler var, ancak daha karmaşık.

sshpass

passwordMevcut olan tek kimlik doğrulama yönteminin olduğu durumlarda , otomatik olarak şifreyi girmek için sshpass kullanılabilir. Lütfen man sayfasının GÜVENLİK ÖNEMİ bölümüne dikkat edin . Her üç seçenekte de , şifre belli bir noktada düz metin olarak görünür veya saklanır :

Anonim boru (sshpass tarafından önerilir)

# 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>&-

Programlama dilleri ile tartışmasız daha kolay, bash oldukça hantal. Şifre yazılmadan önce pip / fd'ye başka bir işlem eklenebilir. Fırsat penceresi oldukça kısa ve süreçleriniz ya da köklerinizle sınırlı.

Çevre değişkeni

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

Siz ve root, sshpass çalışırken ( cat /proc/<pid>/environ | tr '\0' '\n' | grep ^SSHPASS=) işleminizin çevre değişkenlerini (yani şifreniz) okuyabilirsiniz . Fırsat penceresi çok daha uzun ancak yine de diğer kullanıcılar için değil, kendi süreçleriniz veya kökünüz ile sınırlı.

Komut satırı argümanı (en az güvenli)

 sshpass -p my_secret_password ssh user@host

Bu uygun, ancak man sayfasında açıklandığı gibi daha az güvenlidir. Komut satırı argümanları tüm kullanıcılar tarafından görülebilir (örn. ps -ef | grep sshpass). sshpass, argümanı gizlemeye çalışır, ancak tüm kullanıcıların parolanızı argüman tarafından geçirilen parolayı görebildikleri bir pencere vardır .

Kenar notu

Bash HISTCONTROL değişkenini , hassas komutlarınızı bir boşlukla ignorespaceveya veya üstüne ignorebothgetirin. Tarihe kaydedilmeyecekler.


SSH ortak anahtar kimlik doğrulaması

# 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

Parola çok önemlidir. Bir şekilde özel anahtar dosyasını edinen hiç kimse, şifreyi kullanmadan kullanamaz.

SSH kimlik doğrulama aracısını kurun

# 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)

Her zamanki gibi bağlan

ssh user@host

Bunun avantajı, özel anahtarınızın şifrelenmiş olmasıdır ve parolasını yalnızca bir kez girmeniz gerekir (daha güvenli bir giriş yöntemi ile).


8

Şifreler yerine SSH anahtarlarını kullanmak istemediğinizden emin misiniz? Bu şekilde hem güvenli hem de otomatik.


3
SSH anahtarlarını şifresiz kullanmak bir dosyadaki şifreleri kullanmaktan yalnızca biraz daha güvenlidir.
yunzen

10
@yunzen Yanlış. Anahtar kimlik doğrulaması, ana bilgisayar anahtarını bilmiyor olsanız bile sizi mitm saldırılarından korur. Bir saldırgan sunucuyu taklit edebilir, ancak hiçbir zaman gerçek sunucuya bağlanamaz. Parola doğrulaması ile bağlandığınız herhangi bir sunucu (yasal veya değil) parolayı görecektir. Bu nedenlerden dolayı, şifresiz bir ssh anahtarı sadece şifreyi bir dosyaya kaydetmekten çok daha güvenlidir.
kasperd

14
Bu bir cevap değil.
Steve Bennett

@SteveBennett Kabul edilen cevap ile aynıdır ve daha az ayrıntıya sahip olmasına rağmen, ondan önce gönderildi.
Michael Hampton,

3
Kabul edilen cevabın, sorulmamış bir soruya uygun bir cevap olduğunu söyleyebilirim. Bu hiçbir şey değil.
Steve Bennett

4

Otomasyon gereksinimlerinize bağlı olarak, belki de Ansible sizin için uygun olabilir. Parola istemek, sudo parolası istemek, kullanımı değiştirmenin çeşitli yolları, güvenli bir şekilde şifreli sırlar (kasa) kullanmak gibi şeyleri güzel bir şekilde yönetebilir.

Bu uygun değilse, başka bir cevapta önerildiği gibi Bekle'yi öneririm.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.