2009-08-21 31 views
7

"python ssh" uygulamasına girdim. Ssh (şifre ile) kullanarak uzak bir bilgisayara erişebilen harika bir modül pexpect vardır.Uzak bilgisayardan konsol çıktısı alma (ssh + python)

Uzak bilgisayar bağlandıktan sonra, diğer komutları çalıştırabilirim. Ancak sonucu tekrar pythonda alamıyorum.

p = pexpect.spawn("ssh [email protected]_computer") 
print "connecting..." 
p.waitnoecho() 
p.sendline(my_password) 
print "connected" 
p.sendline("ps -ef") 
p.expect(pexpect.EOF) # this will take very long time 
print p.before 

nasıl benim durumumda ps -ef sonucunu elde etmek için?

+0

hmm? p.before –

+0

çıktısını vermelidir python "None" – stanleyxu2005

cevap

1

Ayrıca Python için başka bir SSH kitaplığı olan paramiko'u da araştırmak isteyebilirsiniz.

+0

döndürür Çok farklı çözümler denedikten sonra, bu kitaplığın şimdilik en iyi uygulama olduğunu düşünüyorum. Hatta LAN üzerinden yabancı düğümlerde herhangi bir komut dosyasını çalıştırmak için şifre olmayan giriş yapılandırmak zorunda değilsiniz. – stanleyxu2005

1

deneyin

p.sendline("ps -ef\n") 

IIRC, göndermek metni tam yorumlanır, bu yüzden komutu tamamlamak için diğer bilgisayar muhtemelen bekliyor göndermek.

8

Daha da basit bir yaklaşım denediniz mi?

>>> from subprocess import Popen, PIPE 
>>> stdout, stderr = Popen(['ssh', '[email protected]_computer', 'ps -ef'], 
...      stdout=PIPE).communicate() 
>>> print(stdout) 

, Verilen ben ssh-agent uzak ana hakkında bildiği bir özel anahtarla önceden yüklenmiş çalışır hale geldikten çünkü bu sadece çalışır.

+1

Bu ipucu için teşekkürler. Birçok müşteri için özel anahtarları yapılandırmanın kolay bir yolu var mı? Her hafta 20 makinenin günlük dosyalarını kontrol etmeliyim. Bu bir python betiği yazmanın motivasyonu. – stanleyxu2005

+0

Eh ... sadece her bir makinede açık anahtarınızı ~/.ssh/authorized_keys olarak eklemeniz gerekecek. Belki de, eğer çalışan makineleriniz çok fazla değişmezse, bu tek seferlik bir egzersiz olacaktır. BTW, bu, SSH Agent'ı kurma ve daha fazlası hakkında oldukça düzgün bir makale: http://unixwiz.net/techtips/ssh-agent-forwarding.html –

3
child = pexpect.spawn("ssh [email protected]_computer ps -ef") 
print "connecting..." 
i = child.expect(['[email protected]_computer\'s password:']) 
child.sendline(user_password) 
i = child.expect([' .*']) #or use i = child.expect([pexpect.EOF]) 
if i == 0: 
    print child.after # uncomment when using [' .*'] pattern 
    #print child.before # uncomment when using EOF pattern 
else: 
    print "Unable to capture output" 


Hope this help.. 
İlgili konular