【问题标题】:What is the meaning of the EOFError after I execute a command with paramiko?使用 paramiko 执行命令后 EOFError 是什么意思?
【发布时间】:2018-02-14 14:24:55
【问题描述】:

我正在尝试编写一个 SSH 客户端,用于与我实验室中的设备进行通信。 我使用 paramiko 模块来连接设备,看来我确实设法连接到设备。 但是,我似乎无法将某个命令发送到设备。因为这些是我在这种应用程序(使用 paramiko 的 SSH)中编写的第一行代码,所以我不知道我在哪里失败了。

为了得到专业人士的帮助,我附上了代码和调试

>>> import paramiko
>>> Client_235 = paramiko.SSHClient()
>>> Client_235.set_missing_host_key_policy(paramiko.AutoAddPolicy())
>>> Client_235.load_system_host_keys()
>>> Client_235.connect('50.0.0.235', username='admin', password='admin')
DEBUG:paramiko.transport:starting thread (client mode): 0x4abddd8
DEBUG:paramiko.transport:Local version/idstring: SSH-2.0-paramiko_2.4.0
DEBUG:paramiko.transport:Remote version/idstring: SSH-1.99-IPSSH-6.8.0
INFO:paramiko.transport:Connected (version 1.99, client IPSSH-6.8.0)
DEBUG:paramiko.transport:kex algos:['diffie-hellman-group14-sha1', 'diffie-hellman-group1-sha1', 'diffie-hellman-group-exchange-sha1', 'diffie-hellman-group-exchange-sha256'] server key:['ssh-rsa', 'ssh-dss'] client encrypt:['aes128-cbc', 'aes192-cbc', 'aes256-cbc', 'blowfish-cbc', 'cast128-cbc', '3des-cbc', 'des-cbc', 'des-cbc', 'arcfour128', 'arcfour'] server encrypt:['aes128-cbc', 'aes192-cbc', 'aes256-cbc', 'blowfish-cbc', 'cast128-cbc', '3des-cbc', 'des-cbc', 'des-cbc','arcfour128', 'arcfour'] client mac:['hmac-sha1', 'hmac-sha1-96', 'hmac-md5', 'hmac-md5-96'] server mac:['hmac-sha1', 'hmac-sha1-96', 'hmac-md5', 'hmac-md5-96'] client compress:['none'] server compress:['none'] client lang:[''] server lang:[''] kex follows?False
DEBUG:paramiko.transport:Kex agreed: diffie-hellman-group-exchange-sha256
DEBUG:paramiko.transport:HostKey agreed: ssh-rsa
DEBUG:paramiko.transport:Cipher agreed: aes128-cbc
DEBUG:paramiko.transport:MAC agreed: hmac-sha1
DEBUG:paramiko.transport:Compression agreed: none
DEBUG:paramiko.transport:Got server p (2048 bits)
DEBUG:paramiko.transport:kex engine KexGexSHA256 specified hash_algo <built-in function openssl_sha256>
DEBUG:paramiko.transport:Switch to new keys ...
DEBUG:paramiko.transport:Adding ssh-rsa host key for 50.0.0.235: b'9acccee326cb2423aba3216cee6f6ba9'
DEBUG:paramiko.transport:userauth is OK
INFO:paramiko.transport:Authentication (password) successful!
>>> stdin, stdout, stderr = Client_235.exec_command('c i eth i')
DEBUG:paramiko.transport:[chan 0] Max packet in: 32768 bytes
DEBUG:paramiko.transport:[chan 0] Max packet out: 32768 bytes
DEBUG:paramiko.transport:Secsh channel 0 opened.
DEBUG:paramiko.transport:EOF in transport thread
Traceback (most recent call last):  File "<stdin>", line 1, in <module> File "C:\Program Files\Python35\lib\site-packages\paramiko\client.py", line 8
6, in exec_command chan.exec_command(command)
File "C:\Program Files\Python35\lib\site-packages\paramiko\channel.py", line 63, in _check return func(self, *args, **kwds)
File "C:\Program Files\Python35\lib\site-packages\paramiko\channel.py", line 241, in exec_command self._wait_for_event()
File "C:\Program Files\Python35\lib\site-packages\paramiko\channel.py", line 1198, in _wait_for_event raise e
File "C:\Program Files\Python35\lib\site-packages\paramiko\transport.py", line 1872, in run ptype, m = self.packetizer.read_message()
File "C:\Program Files\Python35\lib\site-packages\paramiko\packet.py", line 426, in read_message header = self.read_all(self.__block_size_in, check_rekey=True)
File "C:\Program Files\Python35\lib\site-packages\paramiko\packet.py", line 276, in read_all raise EOFError()
EOFError
>>>

我做错了什么?通过 SSH 连接发送命令的正确方法是什么?

【问题讨论】:

  • 这通常是 SSH 协商错误。您连接的盒子可能没有正确配置。
  • 当您使用这样的命令行 SSH 客户端尝试相同的操作时,您会得到什么(完全正确):ssh admin@50.0.0.235 c i eth i?
  • @Jared 配置不正确是什么意思?我设法与 putty 建立了 SSH 连接,没有任何问题
  • @MosheS。请参阅 pynexj 的回答。

标签: python python-3.x paramiko


【解决方案1】:

您的 SSH 服务器可能不支持或不允许 exec_command()。您可以通过手动运行以下 ssh 命令(例如从 shell)来验证这一点:

ssh user@host c i eth i

使用手册ssh user@host c i eth i “我得到以下“远程主机关闭到 50.0.0.235 的连接。”

你需要在 paramiko 中启动一个交互式 shell:

ssh = paramiko.SSHClient()
ssh.connect(...)
chan = ssh.invoke_shell()

然后您可以使用Channel.send()Channel.recv() 等API 来发送命令并获取输出。有关详细信息,请参阅 paramiko 关于Channel 的文档。

(这是一个简单的example。)

【讨论】:

  • 我使用了以下命令:ssh user@host。然后我需要等待至少 30 秒,直到收到以下消息:无法建立主机 '50.0.0.235 (50.0.0.235)' 的真实性。 RSA 密钥指纹为 SHA256:HPo9uixHJ/8nHI2mzFTJs2ca7a7Ij8KRn+f7QlVHjZQ。您确定要继续连接(是/否)?然后在我批准“是”后,我需要提供密码并且我设法登录
  • 只有通过这些步骤后,我才能输入“c i eth i”,我知道在我的脚本中同样的步骤也成功了。然后我尝试发送命令。
  • 等了大约40秒后得到如下结果:user@host的密码:
  • 你至少需要输入密码,然后按 ENTER 看看会发生什么。
  • 我得到以下“到 50.0.0.235 的连接被远程主机关闭。”这是什么意思 ?如果我只在登录后输入相同的命令就可以了。