【问题标题】:Python: Paramiko hangs when trying to execute commands over SSHPython:尝试通过 SSH 执行命令时,Paramiko 挂起
【发布时间】:2023-04-21 15:23:01
【问题描述】:

我对 Paramiko 的工作方式相当陌生,但我的主要目标是能够使用 Python 通过 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()

任何帮助将不胜感激:)

【问题讨论】:

  • 你确定stdinstdout没有倒置吗?
  • @mrpopo,你可以使用 pexpect 模块而不是 paramiko
  • 我最初想使用 pexpect,但我使用的是 windows 机器:/ 无法在 windows 上导入资源。不用担心,我将虚拟化一个 debian 客户端并学习 pexpect。

标签: python python-2.7 ssh paramiko


【解决方案1】:

我尝试了与您相同的路线,但也没有太多运气。然后我选择的是 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

【讨论】:

    【解决方案2】:

    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')

    【讨论】:

      【解决方案3】:

      @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 admin@192.168.31.1,admin")
      

      【讨论】: