我不是程序员,但是想将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模块是如何工作的。我试图在网上找到信息,但遗憾的是没有找到任何解决方案。
如果有人能告诉我我做错了什么,或者给我一个关于我能找到解决方案的类似问题的链接,我将非常感激。
提前感谢您的帮助。
答案 0 :(得分: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 refused error when trying to login to a remote server
我想你检查远程主机中的服务器设置
答案 1 :(得分:0)
不是您问题的真正答案,而是更多建议。
我建议您查看结构,它可以完全满足您的需求:在本地或远程主机上自动执行任务。由于您不必为连接和执行命令实现逻辑,因此可能会更容易一些。
Fabric文档:http://docs.fabfile.org/en/1.6/
答案 2 :(得分: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()