2014-10-16 36 views
5

Python altişlemci modülünü kullanarak birden çok ana bilgisayarda komutları paralel olarak yürütmek için kullandığım bir Python betiğim var. Bu SSH sarar, ve temelde yapar böyle bir çağrı:Terminal Python komut dosyasını çalıştırdıktan sonra (yeni satırlar gösterilmiyor) ileti dizisi

output = subprocess.Popen(["/bin/env", env, "/usr/bin/ssh", "-t", "%[email protected]%s" % (user, host), "--", command], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() 

etkili komuta böyle çalıştırılmaktadır:

/bin/env TERM=$TERM:password /usr/bin/ssh -t "%[email protected]%s" % (user, host), "--", command 

O gayet iyi çalışıyor benim terminali berbat olur aralıklı hata alıyorum hariç komut dosyasını çalıştırdıktan sonra (yeni satırları kaybeder). Komut satırından bir "sıfırlama" onu düzeltir, fakat bunun tam olarak nasıl olduğundan emin değilim. Bazen, tuple'ın çıkışındaki ilk öğenin sonunda bir "\ r \ n" olduğunu fark ettim ve bazen yok. Özellikle aşağıdakileri bakın "İzin reddedildi \ r \ n": İkinci çıkış biraz değiştirilmiş, ancak gösterir olmuştur

**** Okay output **** 
[[email protected]/home/user]# ./command.py hosts.lists "grep root /etc/shadow" 
Running command "grep root /etc/shadow" on hosts in file "hosts.test" 
('grep: /etc/shadow: Permission denied\r\n', 'Connection to server1.example.com closed.\r\n') 
('grep: /etc/shadow: Permission denied\r\n', 'Connection to server2.example.com closed.\r\n') 
[[email protected]/home/user]# 


**** Output causes terminal to not display newlines **** 
[[email protected]/home/user]# ./command.py hosts.list "grep root /etc/shadow" 
('grep: /etc/shadow: Permission denied\r\n', 'Connection to server1.example.com closed.\r\n') 
('grep: /etc/shadow: Permission denied\n', 'Connection to server2.example.com closed.\r\n') 
           [[email protected]/home/user]# [[email protected]/home/user]# [[email protected]/home/user] 

eksik "\ r" ve benim istemi nasıl olur "wacked" komut dosyasını çalıştırdıktan sonra.

Bunun, alt işlem komutumdaki "-t" seçeneğini kullanmayla ilgili olduğunu düşünüyorum. Her nasılsa ben kaybediyorum. "-t" seçeneğini kaldırırsam, bu sorun gider, ancak uzun bir hikaye kısa, uzak makinede kullanım için çevresel değişkenler üzerinden geçmesi için ihtiyacım var (Ben kullanıcı parolasını geçmek için TERM değişkenini kullanarak hackishly Sudo amaçları, AcceptEnv uzak sshd sunucu üzerinden geçiş keyfi bir değişken izin olduğunu kabul edemez çünkü; Ben uzak makine üzerinde işlem listesinde görünecek komut satırında şifre geçmek için bunu yapıyorum).

Sadece "-t" seçeneğini kaldırmadan, bunun etrafından dolaşmanın bir yolunu bilip bilmediğini merak ediyor musunuz?

GÜNCELLEME:. Bakılmaksızın aslında çıktı yazdırmak olsun veya olmasın benim senaryo dahilinde benim Tty ayarları subprocess.Popen (...) çalıştırdıktan sonra değişmiş olsun gibi görünüyor iletişim() komut, ekran. Bunu gerçekten tuhaf buluyorum. Burada/(stty -a itibaren) benim tty config farkların önce sonra gibidir:

-ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff 
-ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff 


opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 
-opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 

isig icanon -iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt 
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt 

benim terminali ayarlarını değiştirerek itibaren) (iletişim nasıl durduracağını merak ediyorum? Mümkün mü, yoksa bu bir böcek mi?

+0

* komutunun * gerçekte '-t' ssh seçeneğine ihtiyacı var mı? – jfs

+0

'.communicate()' tty ayarlarınızı değiştirmez. Bazı komut dosyalarında Python komut dosyasını çıkışta bir * komut * olarak geri yükleyemez ve hatayı güvenilir şekilde yeniden üretip çoğaltamayacağınıza bakın, yani betiğin çıkışta tty'yi geri yüklemek mi, yoksa önyükleme mi yapacağı konusunda bir bayrak kabul etmesini sağlayın. – jfs

+0

Örneğin, [bu betikte] bir '--no-geri yükle 'bayrağı iletilirse' nihayet 'bloğunda hiçbir şey yapamazsınız (http://stackoverflow.com/a/327072/4279) – jfs

cevap

4

Aynı sorunu Perl komut dosyasında da vardı. Sorunu çözmek için yerel terminalin geçerli ayarlarını (komut dosyasının sonunda geri yüklemek için) ve uzak komutu çalıştırmadan önce "stty -raw" 'ı önceden kaydetmem gerekti. Perl Yani

:

#save akım terminali ayarlarınız (dosya PID ekleyebilirsiniz)

`stty -g> ~/tmp/.currentTtySettings`;

#Execute uzaktan komut

benim @ dışarı = "Çiğ Stty" prepending `ssh -t -q [email protected] "stty -raw; grep kökü/etc/shadow";

#Restore terminal ayarlarının kedi '\

`stty ~/tmp/.currentTtySettings \` `;

Umut size yardımcı olur!

Diğer çok faydalı linkler:

ssh ve tty (-t seçeneği) https://unix.stackexchange.com/questions/151916/why-is-this-binary-file-being-changed

-Bazı Perl ve SSH ilham ait

-Ayrıntılı açıklama http://search.cpan.org/~bnegrao/Net-SSH-Expect-1.09/lib/Net/SSH/Expect.pod

-Nasıl için "-t" önlemek için sudo https://unix.stackexchange.com/questions/122616/why-do-i-need-a-tty-to-run-sudo-if-i-can-sudo-without-a-password

0

buldum o

stty sane 

konsolu daha önce olduğu gibi geri yükler. Buradaki diğer cevabı gerçekten anlamadım bu yüzden birine yardım ediyorum.

Cevabı here bulundu.