Bir ssh sunucusunda oturum açmak için Shell Script


29

Senaryoda belirtilen şifreyi kullanarak bir ssh sunucusuna otomatik giriş yapabilen bir kabuk betiği yazmayı denedim. Aşağıdaki kodu yazdım:

set timeout 30
/usr/bin/ssh -p 8484 root@172.31.72.103
expect 
{
   "root@172.31.72.103's password" 
   {
      send "password\r" 
   }
}

Bu kod düzgün çalışmıyor, hala şifre istiyor. Biri lütfen bunu çözmeme yardım eder mi?



Yanıtlar:


36

Bir keresinde expectbir ssh sunucusunda oturum açmak için bir senaryo yazdım (davanız gibi) ve senaryom şöyle oldu:

#!/usr/bin/expect

spawn ssh MyUserName@192.168.20.20
expect "password"
send "MyPassword\r"
interact

Bence interactsenaryonda belki eksik.


Bu kesinlikle benim için iyi çalışıyor ve ben bu yerde şaşırıp, etkileşim istemi ile interaktif terminali sağlar, ama daha da fazla adımlar yapmak ister otomatikleştirmek çalışıyorum cdve lsve dosyanın içeriğini okumak da. Etkileşimden sonra yapmak mümkün müdür? Lütfen cevap verin
Hansiemithun

@Hansie lsgiriş yaptıktan sonra bir komut gönderebilirsiniz . Örneğin, şifreyi gönderdikten sonra expect, komut isteminde yazılı olan bir giriş yapın (giriş yaptığınızdan emin olmak için) send "ls\r". Bunların hepsi daha önce gider interact.
Ağustos'ta

soru biraz yanlıştı ve ls yaptıktan ve içeriği okuduktan sonra özür dilerim, aynı şekilde yazdırabilirim. Ancak ssh oturumundan çıkıp yerel makineden erişebilmek için bir değişkene nasıl erişileceği. ref: stackoverflow.com/questions/32341234/expect-script-return-value . Fakat çıktı benim için çalışmıyor. Sorumu gönderildi: stackoverflow.com/questions/51628465/… . file_listYerel komut isteminden erişmek için çıktıktan sonra ihtiyacım var
Hansiemithun

31

Yanlış yoldan gidiyorsun. Yapmak istediğiniz, şifresiz bir ssh-key çifti oluşturmak ve ardından (sunucu RSA anahtar doğrulamasını desteklediği sürece) herkes için bir şifre yazmak zorunda kalmadan girebilirsiniz. Özel anahtarınız çalınabileceği bir yerde saklanırsa bu bir güvenlik riskidir.

Bu adımları takip et:

  1. mkdir -p ~/.ssh
  2. cd ~/.ssh
  3. ssh-keygen -type dsa -i mysshkeys
  4. ReturnParola istendiğinde basın
  5. Onaylamak Returniçin ikinci kez basın .

Şimdi ~/.sshdizinde iki dosya olacak mysshkey.pubve mysshkey. mysshkey.pubGenel anahtarınız ise, bu uzaktaki sunuculara koymak için güvenlidir. mysshkeyÖzel şifresiz anahtarınız ise , uzaktaki sunuculara (veya başka birisinin bir kopyasını alabileceği) koymak güvenli değildir .

Sunucuda SSH'ye girmek istediğiniz:

  1. Uzak sunucuya giriş yapın
  2. mkdir -p ~/.ssh
  3. Kopya ve içeriğini yapıştırın mysshkey.pubiçine~/.ssh/authorized_keys
  4. Emin olun ~/.ssh/authorized_keysis chmod'd600

Şimdi, yerel makinenizde harekete geçirmek için aşağıdaki komutu çalıştırın:

ssh -i ~/.ssh/mysshkey <remote_server_ip>

Ve sizden bir şifre sorulmadan giriş yapacaksınız.

Bu, otomatik olarak oturum açma işlemlerini yönetmek için çok tercih edilen bir yöntemdir, çünkü parolanızı, kodunuzu değiştirirseniz, güncellenmesi gereken birden çok yeri zor kodlamaya zorlamazsınız.


2
DSA yerine RSA anahtarlarını kullanırdım. Ancak bunun dışında tam katılıyorum.
glglgl

12
bazen uzak ana bilgisayara örneğin ağ aletleri gibi anahtar ekleyemezsiniz.
DarkHeart

1
Bunu denedim. ssh hala bir şifre istiyor. Özellikle bir IP adresi vermek zorunda mısın? Hem <user> @ <domain-name> hem de sadece alan adı ile denedim.
Jay Bienvenu

Bu komut çok fazla argüman söyledi? (3. adım için)
Joseph Astrahan

Ben ssh-keygen -t dsa değiştirmek ve yerine dosya konumunu el ile girmek zorunda kaldı.
Joseph Astrahan

20

Debian tabanlı dağıtımlarda, sshpasspaket istediğinizi yapmanın kolay bir yolunu sunar. Paket diğer birçok popüler dağıtım için kullanılabilir. İlk önce onu ayarlamanız gerekir:

echo 'YourPassword' > passwordFile.txt
chmod 600 passwordFile.txt

Ardından SSH komutunu aşağıdaki gibi bir betikten çağırın:

sshpass -f /path/to/passwordFile.txt /usr/bin/ssh -p 8484 root@172.31.72.103

Bu, farklı bir yerel ayar kullanıyorsanız veya kullandığınız çözümlerden ziyade şifreyi değiştirmeniz gerektiğinde daha fazla esneklik sağlar expect.


7

Önce sshPass'i kurun sudo apt-get install sshpass

Sonra .bashrc dosyasında bir diğer ad oluşturun.

alias sshLogin='sshpass -p <your ssh password> ssh username@remote_host'

Şimdi değiştirilen .bashrc dosyanızı yeniden yükleyin source ~/.bashrc

Şimdi bitti.

Şimdi ssh'yi sshLoginterminalde yukarıda oluşturulan diğer adı kullanarak çalıştırabilirsiniz .



2

Bir karma anahtar oluşturmak ve bilgisayarınıza kaydetmek için ihtiyacınız olan her şey

Sadece yaz

ssh-keygen -t rsa -b 4096 # just press Enter till the end

sonra gir

ssh-copy-id <user>@<server>

daha sonra normal olarak kullanarak giriş yapın

ssh <user>@<server>

Şimdi bir şifreye ihtiyacınız yok

Not: Parolanızı düz bir metne kaydetmek tehlikelidir.

Bu yöntem, 4096 uzunluğunda ortak anahtarla RSA kullanarak şifrenizin bir karma değerini yaratır.


1
Bu, bu cevabın tekrarı gibi görünüyor .
roaima

#roaima Evet, ama algo, ssh-copy-idkimsenin bahsetmediği, inanılmaz derecede faydalı bir emirdir. Bunun için can atıyorum.
Huw Walters

1

5 Kolay Adımda SSH Keygen Kullanarak SSH Parolasız Giriş :

Çevre kurulumu: görüntü tanımını buraya girin

Adım 1: SSH-Kegen Anahtarlarının Doğrulanması - (192.168.0.12)
Önce bir kullanıcıyla 192.168.0.12 sunucusuna giriş yapın ve aşağıdaki komutu kullanarak bir çift genel anahtar oluşturun.

görüntü tanımını buraya girin

Adım 2: .ssh Dizini yarat - 192.168.0.11
Aşağıdaki komutu kullanarak, .ssh dizinini oluşturmak üzere sunucuyu 192.168.0.11'e bağlamak için sunucu 192.168.0.12'den SSH kullanın.

görüntü tanımını buraya girin

Adım 3: Üretilen Genel Anahtarları - 192.168.0.11'e
yükleyin Sunucu 192.168.0.12 sunucusundan SSH'yi kullanın ve 192.168.0.11 sunucusuna 192.168.0.11 sunucusundaki yeni oluşturulan ortak anahtarı (id_rsa.pub) yükleyin .ssh.

görüntü tanımını buraya girin

Adım 4: İzinleri Ayarla - 192.168.0.11
Sunuculardaki farklı SSH sürümleri nedeniyle, .sshdizin ve authorized_keysdosya için izinleri ayarlamamız gerekir .

görüntü tanımını buraya girin

Adım 5: 192.168.0.12'den 192.168.0.11'e
giriş yapınız Parola olmadan sunucu Şu andan itibaren, 192.168.0.12 sunucusundan sheene kullanıcısı olarak 192.168.0.12 sunucusundan şifre olmadan tecmint kullanıcısı olarak giriş yapabiliriz.

görüntü tanımını buraya girin


Teşekkürler ... bu benim için çalıştı, 4. adım dışında çarpıcı bir "uyarı" aldım: "KORUMALI ÖZEL KEY DOSYA!" ... /. yoksayıldı ... kötü izinler ". chmod 700 id_rsaYerel olarak .ssh dizininde yaptım (müşteri, örn. Örneğinizde 192.168.0.12) sunucusunda: problem çözüldü
mike rodent


1

Daha önce diğer cevaplarda açıklandığı gibi, ben de kullanıyorum sshpassancak readşifremi geçici bir ortam değişkeninde saklamak için kullanıyorum. Bu şekilde şifrem hiçbir zaman net bir şekilde yazılmaz. İşte kullandığım bir satır komut:

read -s PASS; sshpass -p $PASS ssh <user>@<host adress>

Bundan sonra şifrenizi girmeniz gerekir (ekranda hiçbir şey görünmez) ve enter tuşuna basıldığında bağlantı açılır.


0

Son zamanlarda bunu yaptım, bu size yardımcı olabilir:

sshpass -p 'password' username@ipaddress

bu işe yaramazsa, bağlanmak istediğiniz diğer makinede anahtarlar oluşturmanız gerekir.

ssh-keygen

özel ve genel anahtarlar üretecek ve sizden bir konum isteyecek, boş bırakınız, anahtarları varsayılan olarak .ssh klasörüne kaydedecektir, sizden parola isteyecektir, ayrıca boş bırakabilirsiniz. Genel Yetkili Anahtar Adı '' yetkili_ Anahtar ''

cd .ssh/
mv id_rsa.pub authorized_keys
useradd -d /home/username username

Bu, şimdi listeye kullanıcı ekleyecektir.

chmod 700 /home/username/.ssh
chmod 644 /home/username/.ssh/authorized_keys
chown root:root /home/dozee
sudo service sshd restart

şimdi ssh komutunu çalıştıracağınız yerden özel anahtarı sisteme taşımak zorunda kalacaksınız.

sshpass -p 'password' ssh -i id_rsa username@ip

bu işe yaramazsa, vim editörüyle / etc / ssh open sshd_config komutuna gidin, pubkeyAuthenticatoin'in evet olup olmadığını kontrol edin, evet olarak değiştirilmezse, sshd servislerini yeniden başlatın ve sonra deneyin, kesinlikle çalışacaktır. .


0

İlk argüman ana bilgisayar adı ve ikincisi paroladır.

     #!/usr/bin/expect
     set pass [lindex $argv 1]
     set host [lindex $argv 0]
     spawn ssh -t root@$host echo Hello
     expect "*assword: "
     send "$pass\n";
     interact

Yürütme: ./script.expect

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.