2013-05-29 112 views
1

我对Paramiko的工作原理相当陌生,但我的主要目标是能够使用Python通过SSH运行自动命令。Python:Paramiko在尝试通过SSH执行命令时挂起

我有以下代码,我试图运行一个简单的ls命令开始,但由于某种奇怪的原因代码似乎卡住,没有输出或错误消息产生。

import sys 
import paramiko as pm 
sys.stderr = sys.__stderr__ 
import os 

class AllowAllKeys(pm.MissingHostKeyPolicy): 
    def missing_host_key(self, client, hostname, key): 
     return 

HOST = '192.168.31.1' 
USER = 'admin' 
PASSWORD = 'admin' 

client = pm.SSHClient() 
client.load_system_host_keys() 
client.set_missing_host_key_policy(pm.AutoAddPolicy()) 

client.connect(HOST, username=USER, password=PASSWORD) 

channel = client.invoke_shell() 
stdin = channel.makefile('wb') 
stdout = channel.makefile('rb') 

stdin.write(''' 
ls 
exit 
''') 
print stdout.read() 

stdout.close() 
stdin.close() 

任何帮助,将不胜感激:)

+1

确定'stdin'和'stdout'不倒? – Elazar

+0

@ mrpopo,更好的,你可以使用pexpect模块,而不是paramiko – abhi

+1

我想最初使用pexpect,但我使用的是Windows机器:/ 无法在Windows上导入资源。不用担心,我只会虚拟一个debian客户端并学习pexpect。 – mrpopo

回答

2

我尝试你所要去的同一条路线,并没有多少运气无论是。然后我选择了paramiko Channel类的send()recv()方法。下面是我用什么:

>>> s = paramiko.SSHClient() 
>>> s.load_system_host_keys() 
>>> s.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
>>> s.connect(HOST,USER,PASS) 
>>> c = s.invoke_shell() 
>>> c.send('ls') 
>>> c.recv(1024) 
ls 
bin  etc  usr  home 
proc var  lib  tmp 
-1

@ mrpopo,试试这个代码,它使用pecpect,

import pexpect 
import pxssh 
import time 
import os 

    def tc(ipaddr,password): 
     try: 
      ss = pexpect.spawn(ipaddr) 
      ss.logfile = sys.stdout 
       print "SSH connecting" 
       print 
     except: 
      print "connection refused" 
      print 
      #sys.exit() 

      try: 
       ss.expect (':') 
       ss.sendline (password +"\n") 
        print "connected" 
        time.sleep(30) 
        ss.expect (">") 
        print "connection established" 
        print 

      except: 
        print "Permission denied, please try again." 
         print 
         sys.exit() 
      try: 
       ss.sendline ('ls\n') 
       ss.expect ('>') 

    tc("ssh [email protected],admin") 
1

import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) target_host = 'x.x.x.x' target_port = 22 target_port = 22 pwd = ':)' un = 'root' ssh.connect(hostname = target_host , username = un, password = pwd) stdin, stdout, stderr = ssh.exec_command('ls;exit')