2016-04-12 31 views
1

ben, o zaman tüm uzaktaki bilgisayar için grup eklemek çizgiyle ip_host.list satır oku deployAll.sh, yazma birden fazla uzak ana komut dosyalarını çalıştırmak başarısız: sh deployAll.sh<p></p> ben çalıştırdığınızda, ssh

sonuçları:

Group is added to 172.25.30.11 

değil beklenen sonuçlar:

Group is added to 172.25.30.11 
Group is added to 172.25.30.12 
Group is added to 172.25.30.13 

sadece ilk yürütmek Neden bir? lütfen yardım edin, çok teşekkürler!

deployAll.sh

#!/bin/bash 

    function deployAll() 
    { 
     while read line;do 
      IFS=';' read -ra ipandhost<<< "$line" 
      ssh "${ipandhost[0]}" "groupadd -g 1011 test" 
      printf "Group is added to ${ipandhost[0]}\n" 
     done < ip_host.list 
    } 

deployAll 

ip_host.listssh komutu olmadan

172.25.30.11;test-30-11 
172.25.30.12;test-30-12 
172.25.30.13;test-30-13 
+0

Tuhaf, bana uyar. "Echo $ BASH_VERSION" sonucunu ve "bash -x deployAll.sh" komut dosyasını çalıştırdığınızda. – Coder256

+0

Gerçekten Ansible projesine göz atmak istiyorsunuz: http://docs.ansible.com/ansible/quickstart.html –

cevap

3

stdin'u sulandıran ssh özel davranışından kaynaklanan, döngü açlıktan (yani, while read line;do ...;done)

Lütfen bu konuyu detaylı olarak ele alan Bash FAQ 89'a bakın.

Aynı zamanda ffmpeg ile ilgili benzer bir soruya, bu durumda ssh ile aynı davranışı yanıtladım (ve çözdüm). Burada: When reading a file line by line, I only get to execute ffmpeg on the first line.

TL; DR: ssh 'ın -n seçeneği kullanarak

  • :

üç ana seçenek vardır. man ssh Alıntı:

-n  Redirects stdin from /dev/null (actually, prevents reading from stdin). This must be used when ssh is run in the background. A common trick is to use this to run X11 programs on a remote 
      machine. For example, ssh -n shadows.cs.hut.fi emacs & will start an emacs on shadows.cs.hut.fi, and the X11 connection will be automatically forwarded over an encrypted channel. The ssh pro‐ 
      gram will be put in the background. (This does not work if ssh needs to ask for a password or passphrase; see also the -f option.) 
  • sorunu çözmek için yeterlidir ssh çizgisine sonunda (yani ssh ... </dev/null) bir </dev/null ekleme ve beklendiği gibi ssh davranır yapacaktır.

  • olası değildir bir File Descriptor dan read okuma rastgele program tarafından kullanılmak üzere izin verin:

    while IFS= read -r line <&3; do 
         # Here read is reading from FD 3, to which 'ip_host.list' is redirected. 
        done 3<ip_host.list 
    
+1

Merhaba Rany, Çok teşekkürler, benim için çalışıyor! Ssh'in satırının sonuna " cloud12

+0

Rica ederim! –

1

(benim ağda mantıklı olmaz), çok beklenen çıktıyı almak ssh komutunun kalan standart girdiyi yuttuğunu sanıyorum. Sen (/dev/null den stdin yönlendirmeye eşdeğer) stdin den okumasını ssh önlemek için -n bayrağını kullanmalısınız:

ssh -n "${ipandhost[0]}" "groupadd -g 1011 test" 

veya

ssh "${ipandhost[0]}" "groupadd -g 1011 test" < /dev/null 

See da sık problem var How to keep script from swallowing all of stdin?

İlgili konular