2015-11-06 120 views
1

我在遠程服務器上運行dispynode。我試圖從我的電腦(客戶端)打開SSH隧道並配置dispyJobCluster以使用此隧道。但它不起作用。我沒有配置這個權利?以下是我正在做的:使用通過ssh隧道進行端口轉發的缺陷

(PS 我沒有在分佈式&並行計算也不網絡有深入的瞭解,我是一名土木工程師,所以請原諒我,如果我不使用權。有時技術字)

SSH隧道:

plink -v -ssh -L 61:localhost:21 [email protected] 

這將轉發到端口61連接到本地主機:21其中dispynode運行在服務器上

dispynode:

sudo dispynode.py -d --ext_ip_addr localhost -p 21 -i localhost 

將偵聽端口21,並使用本地主機,導致其傳送雖然隧道回到客戶端

與此dispyClient JobCluster代碼:

cluster = dispy.JobCluster(runCasterDispyWorker, 
          nodes=[('localhost',61)], \ 
          ip_addr='localhost', \ 
          ext_ip_addr='localhost', \ 
          port = 61, \ 
          node_port = 21, \ 
          recover_file='recover.rec', \ 
          ) 
當我啓動 dispy.py時我得到了從我打開SSH隧道命令提示符以下錯誤:

打開連接到本地主機:21轉發來自127.0.0.1:64027
的轉發端口關閉

在至少我猜這意味着dipsy試圖訪問打開的SSH隧道,但我不確定服務器端發生了什麼。似乎dispynode什麼都沒收到。 與服務器上的TCPdump進行快速流量捕獲,以確認它。對於一些未知的原因,端口更改爲64027.


我也曾嘗試同時打開2個SSH隧道:

  • 一個用於客戶機到服務器的通信

    砰砰 - v -ssh -L 61:localhost:21 [email protected]

  • 一個用於服務器到客戶端的通信

    PLINK -v -ssh -R 20:本地主機:60 [email protected]

但沒有運氣。我甚至不能肯定它是否是最好用遠程轉發或本地轉發


我試過這個解決方案的dispy開發者自己建議,但並沒有爲我工作:

http://sourceforge.net/p/dispy/discussion/1771151/thread/bcad6eaa/

我上面使用的配置是否錯誤?我應該使用遠程還是本地轉發?爲什麼端口會自動更改,是否可能是因爲我公司的防火牆通過我嘗試使用的端口阻止連接?有沒有人設法通過SSH隧道運行dispy?

回答

0

這對我有效。它應該爲你工作:

  • SSH隧道(我使用PuTTY的plink.exe創建隧道):

砰砰-v -ssh -R 51347:本地主機:51347 [服務器上的用戶名] @ [服務器的公網IP或域名] -pw [在服務器用戶密碼] -N

  • dispynode(在服務器上運行 - 的Linux):

須藤dispynode.py -d --ext_ip_addr [公共IP或服務器的域名]

  • JobCluster(dipsyClient):

    def Worker(): 
        os.system('echo hello') #prints hello on the server running dispynode 
        return 0 
    
    import os 
    import dispy, logging 
    
    cluster = dispy.JobCluster(\ 
        Worker, \ 
        nodes=['IP public or domain name of server'], \ 
        ext_ip_addr='localhost', \ 
        recover_file='recoverdispy.rec', \ 
        ) 
    
    job = cluster.submit() 
    print "waiting for job completion" 
    job() 
    print('status: %s\nstdout: %s\nstderr: %s\nexception: %s' % (job.status, job.stdout, job.stderr, job.exception)) 
    

試試這段代碼..確保允許使用所需端口