uzaktaki bir makineye ssh'a bir kabuk betiği yazın ve komutları çalıştırın


99

İki sorum var:

  1. Birden fazla uzak linux makinesi var ve her makinede aynı komut setini çalıştıracak bir kabuk betiği yazmam gerekiyor. (Bazı sudo işlemleri dahil). Bu, kabuk komut dosyası kullanılarak nasıl yapılabilir?
  2. Uzak makineye ssh' ederken, RSA parmak izi kimlik doğrulaması istediğinde nasıl işlem yapılacağı.

Uzak makineler, çalıştırma sırasında oluşturulan VM'lerdir ve yalnızca IP'lerine sahibim. Bu nedenle, bu makinelere önceden bir komut dosyası yerleştiremiyorum ve bunları makinemden çalıştıramıyorum.


Uzak Linux makinelerinde, sunucuyla ağ soketi (veya SSL) bağlantısıyla / sunucuya periyodik sorgulama yoluyla bağlantı sağlayan aracı benzeri bir program dağıtmayı düşünüyorum.
Raptor

Bir dizi komutu yalnızca bir kez
yürütmem

"komut dosyası yok", "hiç dosya yok" anlamına gelir, sanırım? Kimlik doğrulamayı nasıl idare ediyorsunuz? Ana bilgisayar parmak izi kontrolünü devre dışı bırakabilirsiniz (cevabıma bakın), ancak bir genel / özel anahtar ayarlamadıysanız yine de etkileşimli bir parola istemi alırsınız.
Andreas Fester

1
Andreas: evet. hiç dosya yok. passwd istemi expect`` beklendiği gibi '' kullanılarak işlenebilir: assword: "
Balanivash

Yanıtlar:


142

Birden fazla uzak linux makinesi var ve her makinede aynı komut setini çalıştıracak bir kabuk betiği yazmam gerekiyor. (Bazı sudo işlemleri dahil). Bu, kabuk komut dosyası kullanılarak nasıl yapılabilir?

Bunu ssh ile yapabilirsiniz, örneğin:

#!/bin/bash
USERNAME=someUser
HOSTS="host1 host2 host3"
SCRIPT="pwd; ls"
for HOSTNAME in ${HOSTS} ; do
    ssh -l ${USERNAME} ${HOSTNAME} "${SCRIPT}"
done

Uzak makineye ssh'lama yapılırken, RSA parmak izi kimlik doğrulaması istendiğinde nasıl davranılacağı.

StrictHostKeyChecking=noSeçeneği ssh'ye ekleyebilirsiniz :

ssh -o StrictHostKeyChecking=no -l username hostname "pwd; ls"

Bu , ana bilgisayar anahtarı kontrolünü devre dışı bırakır ve ana bilgisayar anahtarını bilinen ana bilgisayarlar listesine otomatik olarak ekler. Ana bilgisayarın bilinen ana bilgisayarlar dosyasına eklenmesini istemiyorsanız seçeneği ekleyin -o UserKnownHostsFile=/dev/null.

Bunun , örneğin ortadaki adam saldırısına karşı koruma gibi belirli güvenlik denetimlerini devre dışı bıraktığını unutmayın . Bu nedenle, güvenliğe duyarlı bir ortamda uygulanmamalıdır.


Komut dosyası dili nedir? Elbette sshherhangi bir kabuk betiğinden de arayabilirsiniz
Andreas Fester

ayrıca bir CTRL + C yapmak ve birden çok sunucuya ssh devam etmek istiyorsanız ne olacak ?. örneğin bazı sunucularda parola istiyor, bazılarında ise hayır, bu yüzden komut dosyası orada sıkışıp kalacak. CTRL c veya CTRL d yapmak için -o'ya benzer bir şey yapmanın bir yolu var mı?
Chanafot

5

Bunu halletmenin birkaç yolu var.

En sevdiğim yöntem, uzak sistemlere http://pamsshagentauth.sourceforge.net/ ve ayrıca kendi genel anahtarınızı kurmaktır. (Bunları sanal makineye kurmanın bir yolunu bulun, bir şekilde tüm bir Unix sistemi yüklediniz, birkaç dosya daha nedir?)

Ssh aracınız iletildiğinde, artık her sistemde parola olmadan oturum açabilirsiniz.

Ve daha da iyisi, bu pam modülü sudo için ssh anahtar çiftinizle kimlik doğrulaması yapar, böylece gerektiğinde kök (veya başka herhangi bir kullanıcının) haklarıyla çalıştırabilirsiniz.

Ana bilgisayar anahtarı etkileşimi konusunda endişelenmenize gerek yok. Girdi bir uçbirim değilse, ssh sadece aracıları iletme ve parolalarla kimlik doğrulama becerinizi sınırlar.

Capistrano gibi paketlere de bakmalısınız . Bu siteye kesinlikle bakın; uzaktan komut dosyası oluşturmaya bir giriş vardır.

Tek tek komut satırı satırları şuna benzer:

ssh remote-system-name command arguments ... # so, for exmaple,
ssh target.mycorp.net sudo puppet apply

5

Sshpass'ı kullanarak kurun, apt-get install sshpassardından betiği düzenleyin ve linux makinelerinizin IP'lerini, kullanıcı adlarını ve şifresini ilgili sıraya göre yerleştirin. Bundan sonra o betiği çalıştırın. Bu kadar ! Bu komut dosyası tüm sistemlere VLC'yi kuracaktır.

#!/bin/bash
SCRIPT="cd Desktop; pwd;  echo -e 'PASSWORD' | sudo -S apt-get install vlc"
HOSTS=("192.168.1.121" "192.168.1.122" "192.168.1.123")
USERNAMES=("username1" "username2" "username3")
PASSWORDS=("password1" "password2" "password3")
for i in ${!HOSTS[*]} ; do
     echo ${HOSTS[i]}
     SCR=${SCRIPT/PASSWORD/${PASSWORDS[i]}}
     sshpass -p ${PASSWORDS[i]} ssh -l ${USERNAMES[i]} ${HOSTS[i]} "${SCR}"
done

1
Komut dosyasında gösterilmekten kaçınmak için şifreyi dışa aktarmak için $ SSHPASS kullanın. Ref: tecmint.com/…
Hexy

3

Bu benim için çalışıyor.

Sözdizimi: ssh -i pemfile.pem kullanıcı_adı @ ip_adresi 'command_1; komut 2; komut 3 '

#! /bin/bash

echo "########### connecting to server and run commands in sequence ###########"
ssh -i ~/.ssh/ec2_instance.pem ubuntu@ip_address 'touch a.txt; touch b.txt; sudo systemctl status tomcat.service'

2

Perl kodu yazabiliyorsanız, Net :: OpenSSH :: Parallel kullanmayı düşünmelisiniz .

Her ana bilgisayarda çalıştırılması gereken eylemleri açıklayıcı bir şekilde tanımlayabileceksiniz ve modül tüm korkutucu ayrıntılarla ilgilenecektir. Komutların çalıştırılması sudoda desteklenmektedir.


1

Bu tür görevler için, birkaç kapsama veya VM'de tutarlı bir şekilde bash komut dosyalarını çoğaltmaya izin veren Ansible'ı tekrar tekrar kullanıyorum . Ansible (daha doğrusu Red Hat ) artık ticari Tower'larının açık kaynaklı sürümü olan ek bir web arayüzü AWX'e sahip.

Ansible: https://www.ansible.com/
AWX: https://github.com/ansible/awx
Ansible Tower: ticari ürün, 15 günlük ücretsiz yol yerine muhtemelen ücretsiz açık kaynaklı AWX'i ilk kez keşfedeceksiniz Kule


1

Birden çok uzak Linux makinesinde komutları veya betiği çalıştırmanın birden çok yolu vardır. Basit ve en kolay yollardan biri pssh (paralel ssh programı)

yoluyladır. Pssh : ssh'yi birkaç ana bilgisayarda paralel olarak yürütmek için bir programdır. Tüm işlemlere girdi gönderme, ssh'a parola gönderme, çıktıyı dosyalara kaydetme ve zaman aşımı gibi özellikler sağlar.

Örnek ve Kullanım:

host1 ve host2'ye bağlanın ve her birinden "merhaba, dünya" yazdırın:

 pssh -i -H "host1 host2" echo "hello, world"

Komutları bir komut dosyası aracılığıyla birden çok sunucuda çalıştırın:

pssh -h hosts.txt -P -I<./commands.sh

Ana bilgisayar anahtarlarını kontrol etmeden veya kaydetmeden bir komut kullanın ve çalıştırın:

pssh -h hostname_ip.txt -x '-q -o StrictHostKeyChecking=no -o PreferredAuthentications=publickey -o PubkeyAuthentication=yes' -i  'uptime; hostname -f'

Eğer hosts.txt dosyası 100 gibi çok sayıda girdiye sahipse, paralellik seçeneği de komutların aynı anda çalıştırılmasını sağlamak için 100 olarak ayarlanabilir:

pssh -i -h hosts.txt -p 100 -t 0 sleep 10000

Seçenekler :
-I: Girişi okur ve her ssh işlemine gönderir.
-P: pssh'a çıktığında çıktıyı göstermesini söyler.
-h: Ana bilgisayarın dosyasını okur.
-H: [kullanıcı @] ana bilgisayar [: bağlantı noktası] tek ana bilgisayar için.
-i: Her ana bilgisayar tamamlandığında standart çıktı ve standart hatayı görüntüler
-x bağımsız değişkenler : Fazladan SSH komut satırı bağımsız değişkenlerini
iletir -o seçeneği: Yapılandırma dosyasında kullanılan biçimde seçenekler vermek için kullanılabilir. (/ etc / ssh / ssh_config ) (~ / .ssh / config)
-p paralellik: Verilen sayıyı maksimum eşzamanlı bağlantı sayısı olarak kullanın
-q Sessiz mod: Çoğu uyarı ve tanılama mesajının bastırılmasına neden olur.
-t: Verilen saniye sayısından sonra bağlantıları zaman aşımına uğratın . 0, pssh'nin herhangi bir bağlantıyı zaman aşımına uğratmayacağı anlamına gelir

Uzak makineye ssh'lama yapılırken, RSA parmak izi kimlik doğrulaması istendiğinde nasıl davranılacağı.

RSA kimlik doğrulama istemini işlemek için StrictHostKeyChecking'i devre dışı bırakın.
-o StrictHostKeyChecking = hayır

Kaynak : man pssh


0

Bu benim için çalıştı. Bir işlev yaptım. Bunu kabuk komut dosyanıza koyun:

sshcmd(){
    ssh $1@$2 $3
}

sshcmd USER HOST COMMAND

Aynı komutu yapmak istediğiniz birden fazla makineniz varsa, bu satırı noktalı virgülle tekrar edersiniz. Örneğin, iki makineniz varsa, bunu yaparsınız:

sshcmd USER HOST COMMAND ; sshcmd USER HOST COMMAND

KULLANICI'yı bilgisayarın kullanıcısıyla değiştirin. HOST'u bilgisayarın adıyla değiştirin. COMMAND'i bilgisayarda yapmak istediğiniz komutla değiştirin.

Bu yardımcı olur umarım!


-1

Bu yaklaşımı takip edebilirsiniz:

  • Expect Script kullanarak uzak makineye bağlanın . Makineniz desteklemiyorsa, aynısını indirebilirsiniz. Expect komut dosyası yazmak çok kolaydır (google bu konuda yardım almak için)
  • Uzak sunucuda gerçekleştirilmesi gereken tüm eylemi bir kabuk betiğine koyun.
  • Oturum açma başarılı olduktan sonra beklenen komut dosyasından uzak kabuk komut dosyasını çağırın.

Soruda bahsettiğim gibi, uzaktaki makineler çalıştırılırken oluşturulur ve önceden makinede herhangi bir komut dosyası bulunamaz.
Balanivash

Bu durumda tüm eylemi Expect betiğine koyun. Expect komut dosyası, uzak ana bilgisayarda komutları çalıştırabilir.
rai.skumar
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.