使用paramiko的Python交互式ssh客户端
我不是一名程序员,但我想使用Python实现一些管理目的的自动化。 我尝试创建的“Hello world”之后的第一个应用程序是交互式ssh客户端。 我阅读了一些文档和文章,认为这是使用paramiko模块的最简单方法,但不幸的是,我面临一个问题: 我的应用程序要求您输入一些必要的信息,如服务器ip、用户名、密码。在此之后,它将与已定义的服务器建立连接,并在屏幕上为您提供cli。为了模拟输入命令的过程,我使用while循环。 不幸的是,我的应用程序只有在您输入第一个命令时才能正常工作。尝试键入第二个命令时,出现错误:使用paramiko的Python交互式ssh客户端,python,ssh,paramiko,Python,Ssh,Paramiko,我不是一名程序员,但我想使用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'
我试图删除while循环,并在代码中逐个调用命令,但遇到了相同的问题(键入第二个命令时,会看到相同的错误)。
看起来我不太明白paramiko模块是如何工作的。我试图在网上查找信息,但不幸的是没有找到任何解决方案
如果有人能告诉我我做错了什么,或者给我一个关于类似问题的链接,让我找到解决方案,我将不胜感激
提前感谢您的帮助。请使用pxssh模块。如果适用于windows,这对您的应用程序非常有用 这个例子对你很有帮助
我认为你在远程主机上检查服务器设置并不是对你的问题的真正回答,而是一个建议 我建议您看看fabric,它正是您想要的:自动化本地或远程主机上的任务。可能更容易一些,因为您不必实现连接和执行命令的逻辑
Fabric文档:不幸的是,我没有找到使用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()
据我所知,pexpect仅适用于基于UNIX的操作系统。无论如何,我试图安装它,当使导入pxssh看到一个错误时,一个关键模块没有找到。可能这个操作系统不支持它。Pexpect适用于类UNIX操作系统。正如您在教程中所看到的,fabric支持多种方式(本地、运行、sudo、执行…)来运行每个文件的多个命令。
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()