【发布时间】:2017-10-26 22:39:00
【问题描述】:
我的代码有问题。输出小时效果很好,输出大时就坏了。
这是我的代码:
def listDevices(username, pass, regex):
command = "list-dev " + regex
deviceArray = []
connectString = "plink -ssh -l " + username + " -pw " + pass + " -P " + SshPort + " " + Server + " \"" + command + "\""
rawList = subprocess.check_output(connectString, shell=True)
for line in rawList.split("\r\n"):
if "" is not line:
deviceArray.append(line)
print deviceArray
return deviceArray
Server = 10.10.10.1
SshPort = 22
username = "test"
pass - "password"
regex = "rt*mdr*"
mdrList = listDevices(username, pass, regex)
print mdrList
这在数据较小时可以正常工作,但在数据较大时会失败。
这是错误:
subprocess.CalledProcessError: Command 'plink -ssh -l test -pw password -P 4000 10.10.10.1 "list-dev *"' returned non-zero exit status 1
编辑:
我替换了 plink 并写了 paramiko,但仍然没有得到所有数据。这是代码:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip,username=username, password=password, port = 9000)
list =["list-devices rt*"]
command = '\n'.join(list)
print command
stdin,stdout,stderr = ssh.exec_command(command)
print stdout.read()
它给了我以下错误:
Traceback (most recent call last):
File "C:/Users/xx/Scripts/Test2.py", line 31, in <module>
stdin,stdout,stderr = ssh.exec_command(command)
File "C:\Python27\paramiko\client.py", line 404, in exec_command
chan.exec_command(command)
File "C:\Python27\paramiko\channel.py", line 60, in _check
return func(self, *args, **kwds)
File "C:\Python27\paramiko\channel.py", line 229, in exec_command
self._wait_for_event()
File "C:\Python27\paramiko\channel.py", line 1086, in _wait_for_event
raise e
paramiko.ssh_exception.SSHException: Channel closed.
【问题讨论】:
-
您可以使用
subprocess.check_output()来简化一下吗?您不需要写入临时文件。 -
@Wyatt,这正是我已经在第一个做的,但它失败了。我创建了第二个,认为保存到文件可能会起作用,但它也没有。它适用于小数据,但当数据很大时,它就会失败。
-
我浏览了第一个版本,实际上只看了第二个版本。看起来
plink命令在更大的数据上超时。如果直接在命令行运行,是否成功完成? -
@Wyatt,你是对的。我在电源外壳上运行了命令,几秒钟后我收到了服务器发送断开连接请求的致命错误。是plink限制还是服务器是这样设置的?如果是 plink,你知道有什么替代 plink 的方法吗?
-
顺便说一句,
subprocess.check_output(connectString, shell=True)从安全角度来看是完全危险的。如果用户提供的密码包含; rm -rf ~或任何平台本地 Windows 等效项怎么办?传递显式参数列表比传递字符串更安全。
标签: python python-2.7 subprocess cisco