【问题标题】:Proxycommand in paramikoparamiko 中的代理命令
【发布时间】:2017-05-18 16:15:09
【问题描述】:

我正在尝试在 python 中使用 paramiko 做一个简单的代理命令。

基本上我正在尝试复制此 ssh 命令的行为:

ssh -i ~/.ssh/destination_key user@destination.test.internal -o 'ProxyCommand ssh -i ~/.ssh/jumpbox_key -W %h:%p user@jumpbox.test.internal'

上述工作如预期 amd 连接到destination.test.internal。 我正在尝试在 python 中在同一个盒子上做同样的事情:

#!/usr/bin/python3
import paramiko
import argparse

addresses = ["destination.test.internal"];

ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

proxy = paramiko.ProxyCommand("ssh -i ~/.ssh/jumpbox_key -W %h:%p user@jumpbox.test.internal")

for address in addresses:
    #Connect over ssh to each server
    try:
        ssh.connect(address , username='user', key_filename="~/.ssh/destination_key", sock = proxy )       
    except paramiko.AuthenticationException:
        print ("Authentication Failed")
    except paramiko.SSHException:
        print ("Connection Failed")


    stdin,stdout,stderr = ssh.exec_command('ls -l')
    print (stdout.readlines())

    ssh.close()

不用说这是行不通的。它失败了:

Traceback (most recent call last):
Exception: Error reading SSH protocol banner
  File "/usr/local/lib/python3.5/dist-packages/paramiko/transport.py", line 1893, in _check_banner
    buf = self.packetizer.readline(timeout)
  File "/usr/local/lib/python3.5/dist-packages/paramiko/packet.py", line 331, in readline
    buf += self._read_timeout(timeout)
  File "/usr/local/lib/python3.5/dist-packages/paramiko/packet.py", line 501, in _read_timeout
    raise socket.timeout()
socket.timeout

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/paramiko/transport.py", line 1749, in run
    self._check_banner()
  File "/usr/local/lib/python3.5/dist-packages/paramiko/transport.py", line 1897, in _check_banner
    raise SSHException('Error reading SSH protocol banner' + str(e))
paramiko.ssh_exception.SSHException: Error reading SSH protocol banner

Connection Failed
Traceback (most recent call last):
  File "./log_file_fix.py", line 31, in <module>
    stdin,stdout,stderr = ssh.exec_command('ls -l')
  File "/usr/local/lib/python3.5/dist-packages/paramiko/client.py", line 436, in exec_command
    chan = self._transport.open_session(timeout=timeout)
  File "/usr/local/lib/python3.5/dist-packages/paramiko/transport.py", line 716, in open_session
    timeout=timeout)
  File "/usr/local/lib/python3.5/dist-packages/paramiko/transport.py", line 800, in open_channel
    raise SSHException('SSH session not active')
paramiko.ssh_exception.SSHException: SSH session not active

但是我不确定我哪里出错了。

【问题讨论】:

  • 我正在为同样的问题而苦苦挣扎......你有没有发现它?
  • 恐怕不行。最终,需求发生了变化,因此不需要它,所以我永远无法解决它。
  • 好的,谢谢您的反馈。

标签: python python-3.x paramiko


【解决方案1】:

在 paramiko.ProxyCommand() 中指定主机和端口,而不是 %h:%p

proxy = paramiko.ProxyCommand("ssh -i ~/.ssh/jumpbox_key -W DESTINATION_HOST_ADDRESS:22 user@jumpbox.test.internal")

你必须改变你的代码如下:

#!/usr/bin/python3
import paramiko
import argparse

addresses = ["destination.test.internal"];

ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  
for address in addresses:
    proxy_jump_command='ssh -i ~/.ssh/jumpbox_key -W {HOST}:{PORT} user@jumpbox.test.internal'.format(HOST=address, PORT=22)
    proxy = paramiko.ProxyCommand(proxy_jump_command)
    #Connect over ssh to each server
    try:
        ssh.connect(address , username='user', key_filename="~/.ssh/destination_key", sock = proxy )       
    except paramiko.AuthenticationException:
        print ("Authentication Failed")
    except paramiko.SSHException:
        print ("Connection Failed")


    stdin,stdout,stderr = ssh.exec_command('ls -l')
    print (stdout.readlines())

    ssh.close()

【讨论】:

    猜你喜欢
    • 2020-04-17
    • 2011-06-03
    • 2020-10-02
    • 2020-11-04
    • 2014-12-28
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    相关资源
    最近更新 更多