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?
* komutunun * gerçekte '-t' ssh seçeneğine ihtiyacı var mı? – jfs
'.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
Ö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