我有一个非常简单的任务:使用ssh,我想创建一个隧道,将来自本地计算机的流量转发到远程计算机上的特定端口。我可以从命令行执行此操作:
ssh -N -L 123:127.0.0.1:456 user@remotehost
然后如果我跑:
telnet localhost 123
它相当于登录remotehost
并运行
telnet 127.0.0.1 456
我设法用以下的方式做到了这一点;
subprocess.Popen(['ssh', '-N', '-L', '%i:127.0.0.1:%i' % (new_port, old_port), ssh_user + '@' + ip_addr])
但是现在我想摆脱它,只使用Python - 没有外部过程。
我已尝试使用fabric.context_managers.remote_tunnel但除非我误解了这是为了创建一个从远程位置开始的隧道,而不是从本地计算机开始。也就是说,它相当于SSH到远程计算机并从那里创建SSH隧道,这对我来说是愚蠢的。我想我可以将远程主机设置为实际上是本地机器,但这似乎效率低下,说实话,我甚至不知道如何做到这一点。
我还尝试了forward.py on paramiko,但由于我的私钥已加密,因此无法正常工作。我想修改脚本来处理它,并且只是为了我的需要简化它,但脚本和paramiko库都令人生畏,我不知道如何开始。
当然有一种简单的方法可以做到这一点吗?到目前为止我似乎非常接近。
答案 0 :(得分:0)
“纯Python”是什么意思? Subprocess与标准的python安装捆绑在一起。
Subprocess和Fabric是为这些任务而设计的,你为什么要离开它们呢?
如果你有,最小的任务要远程执行,例如检查内存,主机名等,你可以继续suprocess。但是如果你有一些很大的要求,我建议你选择面料。
出于您必须在同一台机器上工作的目的,为什么不将子进程与check_call或Popen一起使用。作为替代方案,您可以完全更改代码,以便能够进入Unix内核以实现Linux命令的功能。