2015-01-12 113 views
0

我有一個非常簡單的任務:使用ssh,我想創建一個隧道,將流量從本地機器轉發到遠程機器上的特定端口。我可以在命令行中執行此操作:如何使用純Python輕鬆創建本地SSH隧道

ssh -N -L 123:127.0.0.1:456 [email protected] 

然後,如果我運行:

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

爲什麼你不想使用Popen或織物? – Harman

回答

0

「純Python」是什麼意思?子進程與標準的python安裝捆綁在一起。

子流程和麪料是專門爲這樣的任務設計的,您爲什麼想要離開它們?

如果你有,最小的任務要遠程執行,例如,檢查內存,主機名等,你可以繼續使用suprocess。但是,如果你有一些很大的要求,我會建議去織物。

爲了您的目的,您必須在同一臺機器上工作,爲什麼不使用check_call或Popen的子進程。作爲替代,您可以完全更改代碼,以便能夠進入Unix核心以實現Linux命令的功能。