1

我不是程序员,但想使用 Python 来实现某些管理目的的自动化。我尝试创建的“Hello world”之后的第一个应用程序是交互式 ssh 客户端。我已经阅读了一些文档和文章,并认为这将是使用 paramiko 模块的最简单方法,但不幸的是我遇到了一个问题:我的应用程序要求您输入一些必要的信息,例如服务器 ip、用户名、密码。在此之后,它与定义的服务器建立连接,并在您的屏幕上为您提供 cli。为了模拟输入命令的过程,我使用了 while 循环。不幸的是,我的应用程序仅适用于您输入的第一个命令。尝试键入第二个命令时出现错误:

Traceback (most recent call last):
  File "C:\Python27\Tests\ssh_client.py", line 53, in <module>
    client.execute_command(command)
  File "C:\Python27\Tests\ssh_client.py", line 26, in execute_command
    stdin,stdout,stderr = self.connection.exec_command(command)
  File "C:\Python27\lib\site-packages\paramiko\client.py", line 343, in exec_command
    chan.exec_command(command)
AttributeError: 'NoneType' object has no attribute 'exec_command'

程序代码(Windows 7):

import paramiko

SERVER = raw_input('Please enter an ip address of remote host: ')
USER = raw_input('Please enter your username: ')
PASSWORD = raw_input('Please enter your password: ')

class MYSSHClient():

    def __init__(self, server=SERVER, username=USER, password=PASSWORD):
        self.server = server
        self.username = username
        self.password = password
        self.connection = None
        self.result =  ''
        self.is_error = False


    def do_connect(self):
        self.connection = paramiko.SSHClient()
        self.connection.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        self.connection.connect(self.server, username=self.username, password=self.password)

    def execute_command(self, command):
        if command:
            print command            
            stdin,stdout,stderr = self.connection.exec_command(command)
            stdin.close()
            error = str(stderr.read())
            if error:
                self.is_error = True
                self.result = error
                print 'error'
            else:
                self.is_error = False
                self.result = str(stdout.read())
                print 'no error'

            print self.result


        else:
            print "no command was entered"

    def do_close(self):
        self.connection.close()

if __name__ == '__main__':
    client = MYSSHClient()
    client.do_connect()
    while 1:
        command = raw_input('cli: ')
        if command == 'q': break
        client.execute_command(command)
    client.do_close()

我试图删除while循环并在代码中一一调用命令,但有同样的问题(输入第二个命令时看到同样的错误)。看起来我不完全理解 paramiko 模块是如何工作的。我试图在网上查找信息,但不幸的是没有找到任何解决方案。

如果有人能告诉我我做错了什么或给我一个类似问题的链接,我将不胜感激,我可以在其中找到解决方案。

提前感谢您的帮助。

4

3 回答 3

0

不幸的是,我没有找到使用 paramiko 模块解决问题的方法,但我找到了 Exscript 这样的模块。简单的代码如下:

from Exscript.util.interact import read_login
from Exscript.protocols import SSH2


account = read_login()
conn = SSH2()                       
conn.connect('192.168.1.1')     
conn.login(account)  


while True:
    command = raw_input('cli: ')
    if command == 'q': break
    conn.execute(command)
    print conn.response



conn.send('quit\r')               
conn.close() 
于 2013-06-24T11:59:05.817 回答
0

请用于 pxssh 模块,如果适用于 Windows Python,这对您的应用程序非常有用:How can remote from my local pc to remoteA to remoteb to remote c using Paramiko 这个例子对您非常有帮助Python - Pxssh - Getting an password denied error when尝试登录远程服务器

我想你在远程主机中检查你的服务器设置

于 2013-06-21T07:38:01.950 回答
0

不是对您的问题的真正答案,而是更多的建议。

我建议您看一下 fabric,它完全符合您的要求:在本地或远程主机上自动执行任务。可能会更容易一些,因为您不必实现连接和执行命令的逻辑。

面料文档:http ://docs.fabfile.org/en/1.6/

于 2013-06-21T08:22:49.907 回答