首页 > 解决方案 > 无法使用 ssh2-python 包向远程机器发送命令

问题描述

问题

您好我的问题是我想使用 ssh2-python 包远程读取一堆文件,但我似乎无法向远程主机发送命令。

最初我从 paramiko 包开始,我确实让它工作,但我正在处理很多大内存文件(这就是为什么我不能把它们带到本地机器上)而且它有点太慢了。我目前正在运行 Python 3.6.3 和 ssh2-python 0.18.0.post1 并尝试更改 ssh2-python 的版本,但没有帮助。

代码

import socket
from ssh2.session import Session

host_ip=socket.gethostbyname('hostname')
sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host_ip,22))
session=Session()
session.handshake(sock)
print(session.userauth_list('username'))
session.userauth_password('username','password')
channel=session.open_session()
channel.execute('echo Hello')

代码打印以下内容

0

['publickey', 'gssapi-keyex', 'gssapi-with-mic', '密码']

0

0

期望/想法

我希望代码打印 Hello,但它只是打印了 0。它还在握手之后和调用身份验证方法之后打印了 0,我不知道为什么。似乎我正在与远程机器联系,因为它确实打印出了它将需要哪些身份验证,但在我看来,我实际上并没有登录并且可以做任何事情。我真的很想使用这个包,因为从我在网上阅读的内容来看,paramiko 的速度要快得多,(替代品会很好)但我似乎无法弄清楚这里发生了什么。

请提前帮助和感谢!

标签: handshakelibssh2ssh2

解决方案


您实际上可能已连接并执行命令,但channel.execute('ls')返回“0”(它是退出/状态代码)。

如果您想从服务器读取您的响应:

channel.execute('echo Hello')
size, data = channel.read()
while size:
    size, dt = channel.read()
    data += dt

print(data.decode())

ssh2-python 的 API 文档相当稀疏,但这些示例应该让您了解一些基础知识:https ://github.com/ParallelSSH/ssh2-python/tree/master/examples

以上内容的完整版本在example_echo.py


推荐阅读