使用python中的paramiko库使用SOCKS进行动态应用程序级端口转发

rok*_*rok 4 python ssh putty paramiko socks

我正在尝试以下列方式连接到SSH服务器:

import paramiko
import socks
sock = socks.socksocket()
sock.setproxy(socks.PROXY_TYPE_SOCKS5, 'localhost', 22, True)
sock.connect((**IP address of SSH server**, 22))
t = paramiko.Transport(sock)
t.connect( None, 'username', 'password')
Run Code Online (Sandbox Code Playgroud)

并得到以下错误

> Traceback (most recent call last): ...
>     sock.connect((**IP address of SSH server**, 22))   File "C:\Python27\lib\site-packages\socks.py", line 368, in connect
>     _orgsocket.connect(self,(self.__proxy[1],portnum))   File "C:\Python27\lib\socket.py", line 224, in meth
>     return getattr(self._sock,name)(*args) socket.error: [Errno 10061] No connection could be made because the target machi ne actively
> refused it
Run Code Online (Sandbox Code Playgroud)

我的目标是在此处模拟Putty创建SSH SOCKS代理的方式: 配置PuTTY以创建用于安全浏览的SSH SOCKS代理.或同等学历

ssh -D [localhost]端口

用于本地动态应用程序级端口转发.

有人可以解释,有什么问题以及如何使用paramiko以正确的方式做到这一点?谢谢.

PS我发现这个/sf/answers/407636841/但是,我没有成功实现它.有人?

Spe*_*bun 5

Paramiko可以原生连接到ssh.您不需要SOCKS库来连接到ssh服务器.此外,当您尝试时,远程服务器拒绝连接,因为您不进行身份验证.

正确的方法是连接paramiko的sshClient:

import paramiko
ssh = paramiko.SSHClient()
ssh.connect('yourServer', username='you', 
    password='yay!')
Run Code Online (Sandbox Code Playgroud)

然后,获取底层传输:

trans = ssh.get_transport()
Run Code Online (Sandbox Code Playgroud)

最后,让ssh客户端转发一个带有开放通道的tcp端口:

trans.open_channel("forwarded-tcpip", dest_addr=('serverIP',8000), src_addr=('localhost'),8000))
Run Code Online (Sandbox Code Playgroud)

这将导致本地端口8000上的任何连接通过此ssh会话远程转发到端口8000.

  • @ user1264304您可能需要先调用`request_port_forward`.或者,您的服务器可能不允许端口转发您选择的任何端口.或任何端口. (2认同)