python - 通过SOCKS5代理连接SSH服务器

标签 python ssh key paramiko socks

如何在Python中使用共享 key 和socks通过ssh连接?

我已经测试了几种方法,有什么建议吗?

提前非常感谢...

导入:

import paramiko
from paramiko import RSAKey
import socket
import socks
import base64

脚本:

def createSSHClient(server, port, user):
    
    sock=socks.socksocket()
    sock.set_proxy(
        proxy_type=socks.SOCKS5,
        addr='10.0.0.2',
        port=1080,
        username=base64.b64decode('dXNlcg==').decode("utf-8"),
        password=base64.b64decode('cGFzc3dvcmQ=').decode("utf-8")
    )
             
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    privkey = paramiko.RSAKey.from_private_key_file('/home/my-user/.ssh/id_rsa')
    ssh.connect(server, port, user, privkey, sock)
    return ssh

outputsocks = []
ssh = createSSHClient('192.168.1.23', 22, 'my-user')
outputsocks.append((ssh.exec_command('ls -ltr')[1]).read().decode('ascii'))
ssh.close()

print(outputsocks)

输出:

Traceback (most recent call last):
  File "/home/my-user/teste2.py", line 26, in <module>
    ssh = createSSHClient('192.168.1.23', 22, 'my-user')
  File "/home/my-user/teste2.py", line 22, in createSSHClient
    ssh.connect(server, port, user, privkey, sock)
  File "/usr/local/lib/python3.6/site-packages/paramiko/client.py", line 349, in connect
    retry_on_signal(lambda: sock.connect(addr))
  File "/usr/local/lib/python3.6/site-packages/paramiko/util.py", line 283, in retry_on_signal
    return function()
  File "/usr/local/lib/python3.6/site-packages/paramiko/client.py", line 349, in <lambda>
    retry_on_signal(lambda: sock.connect(addr))
TimeoutError: [Errno 110] Connection timed out

注意:如果您删除通过socks的连接并使用不需要VPN的主机,则相同的脚本将起作用,socks凭据正确且共享 key 有效。

最佳答案

错误是由于在启动 SSH 之前未通过 sock 打开连接,已使用 sock.connect() 解决了该问题

更多信息: socket connect() vs bind()

错误修复:

def createSSHClient(server, port, user):
    
    sock=socks.socksocket()
    sock.set_proxy(
        proxy_type=socks.SOCKS5,
        addr='10.0.0.2',
        port=1080,
        username=base64.b64decode('dXNlcg==').decode("utf-8"),
        password=base64.b64decode('cGFzc3dvcmQ=').decode("utf-8")
    )
    sock.connect(('192.168.1.20',22))
             
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    privkey = paramiko.RSAKey.from_private_key_file('/home/my-user/.ssh/id_rsa')
    ssh.connect(server, port, user, privkey, sock)
    return ssh

outputsocks = []
ssh = createSSHClient('192.168.1.23', 22, 'my-user')
outputsocks.append((ssh.exec_command('ls -ltr')[1]).read().decode('ascii'))
ssh.close()
sock.close()

print(outputsocks)

关于python - 通过SOCKS5代理连接SSH服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62523323/

相关文章:

python - Paramiko的open_sftp()降落SSH服务器引发 “EOF during negotiation”异常

Python - 基于键/值标识的分组/合并字典

python - 使用 python 或 bash 连接具有相同 ID 的 2 个文件

python - 已安装六个 1.4.1,但在 mac OS sierra 中 set( ['OpenSSL' ]) 需要六个 >=1.5.2

ssh - 如何为 rsync SSH 命令自动传递密码?

php - 数组键上的模式匹配

r - 如何检查一组列是否是 R 中数据框的超键?

python - Python 中的无效 URL (POST/v1/chat/completions) 错误

python - 如何使用accuracy_score(或其他建议的函数)测量xgboost回归器的准确性

ssh - 将远程源文件复制到远程目标文件夹