将 paramiko 与 socks 代理一起使用
Using paramiko with socks proxy
我尝试将 paramiko 与配置为 socks 代理的 socks 代理(SecureCRT 或 putty)一起使用。我正在使用下面的代码和
import paramiko,socks
host, port = '127.0.0.1', 1080
# Set up your proxy information for this socket
sock=socks.socksocket()
sock.set_proxy(
proxy_type=socks.SOCKS4,
addr=host,
port=port,
)
# Connect the socket
sock.connect((host, port))
# Create your Paramiko Transport
transport = paramiko.Transport(sock)
transport.connect(
username='username', #<------not sure if it is needed, the socks proxy needs no username/password
password='secret',
)
client = paramiko.client.SSHClient.connect('remotedevice', username='usernameonremotedevice',sock=sock)
stdin, stdout, stderr=client.exec_command("ls -la")
# Do stuff
# Clean up
client.close()
transport.close()
这是我遇到的错误
上述方法似乎混淆了 paramiko,因为它对两者都使用 127.0.0.1
我的问题起源于 exscript 使用的 paramiko 库,所以我想简化一下看看这是否可行....
这是 secureCRT 每次尝试时显示的日志
[LOCAL] : Starting port forward from 127.0.0.1 on local 127.0.0.1:1080 to remote 127.0.0.1:1080.
[LOCAL] : Could not start port forwarding from local service 127.0.0.1:3106 to 127.0.0.1:1080. Reason: The channel could not be opened because the connection failed. Server error details: Connection refused
脚本失败如下:
Traceback (most recent call last):
File "C:\Users\Username\Documents\Eclipse\ESNetworkDiscovery\ParamikoProxyTest.py", line 24, in <module>
sock.connect((host, port))
File "C:\Utils\WPy2.7-32\python-2.7.13\lib\site-packages\socks.py", line 96, in wrapper
return function(*args, **kwargs)
File "C:\Utils\WPy2.7-32\python-2.7.13\lib\site-packages\socks.py", line 813, in connect
negotiate(self, dest_addr, dest_port)
File "C:\Utils\WPy2.7-32\python-2.7.13\lib\site-packages\socks.py", line 667, in _negotiate_SOCKS4
raise SOCKS4Error("{0:#04x}: {1}".format(status, error))
socks.SOCKS4Error: 0x5b: Request rejected or failed
sock.connect((host, port))
应该使用 SSH 服务器的主机名(与您用于 SSHClient.connect()
的主机相同)和端口(SSH 默认 22
)。
@pynexj 的回答是正确的,但有一个完整的工作示例总是好的:
import socks
import paramiko
sock=socks.socksocket()
sock.set_proxy(
proxy_type=socks.SOCKS5,
addr="proxy.host.name.example",
port=1080,
username="blubbs",
password="blabbs"
)
sock.connect(('ssh.host.name.example', 22))
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('ignored without host key verification', username='caesar', sock=sock)
print((ssh.exec_command('ls')[1]).read().decode())
ssh.close()
我尝试将 paramiko 与配置为 socks 代理的 socks 代理(SecureCRT 或 putty)一起使用。我正在使用下面的代码和
import paramiko,socks
host, port = '127.0.0.1', 1080
# Set up your proxy information for this socket
sock=socks.socksocket()
sock.set_proxy(
proxy_type=socks.SOCKS4,
addr=host,
port=port,
)
# Connect the socket
sock.connect((host, port))
# Create your Paramiko Transport
transport = paramiko.Transport(sock)
transport.connect(
username='username', #<------not sure if it is needed, the socks proxy needs no username/password
password='secret',
)
client = paramiko.client.SSHClient.connect('remotedevice', username='usernameonremotedevice',sock=sock)
stdin, stdout, stderr=client.exec_command("ls -la")
# Do stuff
# Clean up
client.close()
transport.close()
这是我遇到的错误
上述方法似乎混淆了 paramiko,因为它对两者都使用 127.0.0.1 我的问题起源于 exscript 使用的 paramiko 库,所以我想简化一下看看这是否可行....
这是 secureCRT 每次尝试时显示的日志
[LOCAL] : Starting port forward from 127.0.0.1 on local 127.0.0.1:1080 to remote 127.0.0.1:1080.
[LOCAL] : Could not start port forwarding from local service 127.0.0.1:3106 to 127.0.0.1:1080. Reason: The channel could not be opened because the connection failed. Server error details: Connection refused
脚本失败如下:
Traceback (most recent call last):
File "C:\Users\Username\Documents\Eclipse\ESNetworkDiscovery\ParamikoProxyTest.py", line 24, in <module>
sock.connect((host, port))
File "C:\Utils\WPy2.7-32\python-2.7.13\lib\site-packages\socks.py", line 96, in wrapper
return function(*args, **kwargs)
File "C:\Utils\WPy2.7-32\python-2.7.13\lib\site-packages\socks.py", line 813, in connect
negotiate(self, dest_addr, dest_port)
File "C:\Utils\WPy2.7-32\python-2.7.13\lib\site-packages\socks.py", line 667, in _negotiate_SOCKS4
raise SOCKS4Error("{0:#04x}: {1}".format(status, error))
socks.SOCKS4Error: 0x5b: Request rejected or failed
sock.connect((host, port))
应该使用 SSH 服务器的主机名(与您用于 SSHClient.connect()
的主机相同)和端口(SSH 默认 22
)。
@pynexj 的回答是正确的,但有一个完整的工作示例总是好的:
import socks
import paramiko
sock=socks.socksocket()
sock.set_proxy(
proxy_type=socks.SOCKS5,
addr="proxy.host.name.example",
port=1080,
username="blubbs",
password="blabbs"
)
sock.connect(('ssh.host.name.example', 22))
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('ignored without host key verification', username='caesar', sock=sock)
print((ssh.exec_command('ls')[1]).read().decode())
ssh.close()