Python 使用paramiko进行远程端口转发
如何使用Paramiko实现远程端口转发?我已经看到了一些在本地端口转发的例子,但这让我感到困惑。我想实施Python 使用paramiko进行远程端口转发,python,paramiko,portforwarding,Python,Paramiko,Portforwarding,如何使用Paramiko实现远程端口转发?我已经看到了一些在本地端口转发的例子,但这让我感到困惑。我想实施 ssh -N -R 2210:localhost:5000 username@remotehost 和帕拉米科。(将remotehost端口2210转发到localhost端口5000,不要打开shell,因为这是不允许的)。我试过了 ssh=paramiko.SSHClient() ssh.connect(remotehost, username=remoteusername, key
ssh -N -R 2210:localhost:5000 username@remotehost
和帕拉米科。(将remotehost端口2210转发到localhost端口5000,不要打开shell,因为这是不允许的)。我试过了
ssh=paramiko.SSHClient()
ssh.connect(remotehost, username=remoteusername, key_filename="/....")
transport = ssh.get_transport()
transport.open_channel(......)
但dest_addr、src_addr和action(直接tcpip、转发tcpip)的所有组合似乎都无法传递异常(管理禁止)。我的命令行ssh可以工作,所以我有权这样做,但我不知道如何实现Paramiko
有什么想法吗
Hannu演示了如何通过paramiko进行远程端口转发。
此脚本连接到请求的SSH服务器并设置远程端口
通过隧道从远程端口转发(openssh-R选项)
连接到可从本地计算机访问的目标
示例:ssh-R 4000:internal.Example.com:80 public.Example.com
import socket
import select
import sys
import threading
import paramiko
def handler(chan, host, port):
sock = socket.socket()
try:
sock.connect((host, port))
except Exception as e:
print("Forwarding request to %s:%d failed: %r" % (host, port, e))
return
print(
"Connected! Tunnel open %r -> %r -> %r"
% (chan.origin_addr, chan.getpeername(), (host, port))
)
while True:
r, w, x = select.select([sock, chan], [], [])
if sock in r:
data = sock.recv(1024)
if len(data) == 0:
break
chan.send(data)
if chan in r:
data = chan.recv(1024)
if len(data) == 0:
break
sock.send(data)
chan.close()
sock.close()
def reverse_forward_tunnel(server_port, remote_host, remote_port, transport):
transport.request_port_forward("", server_port)
while True:
chan = transport.accept(1000)
if chan is None:
continue
thr = threading.Thread(
target=handler, args=(chan, remote_host, remote_port)
)
thr.setDaemon(True)
thr.start()
def main():
"""
ssh -R 4000:internal.example.com:80 public.example.com
"""
ssh_host = 'public.example.com'
ssh_port = 22
ssh_user = 'root'
ssh_pass = 'password'
remote_bind_port = 4000 # port on server to forward
forward_host = 'internal.example.com' # dest host to forward to
forward_port = 80 # dest port to forward to
client = paramiko.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.WarningPolicy())
try:
client.connect(
ssh_host,
ssh_port,
username=ssh_user,
password=ssh_pass,
)
except Exception as e:
print("*** Failed to connect to %s:%d: %r" % (ssh_host, ssh_port, e))
sys.exit(1)
print(
"Now forwarding remote port %d to %s:%d ..."
% (remote_bind_port, forward_host, forward_port)
)
try:
reverse_forward_tunnel(
remote_bind_port, forward_host, forward_port, client.get_transport()
)
except KeyboardInterrupt:
print("C-c: Port forwarding stopped.")
sys.exit(0)
if __name__ == "__main__":
main()
当然,我可以返回到subprocess.Call并执行ssh,但我希望将其保存在代码中以帮助监视连接状态。这个答案为我解决了这个问题: