2016-03-10 53 views
2

我想實現此場景: 在AWS上,我有一個VPC,在其中部署公有和私有子網。在公共子網中,我有一個「堡壘」實例,而在私有子網中,有一個節點運行某些服務(AKA「服務實例」)。 通過使用*馬錢ssh命令,我可以做這樣的事情,從我的本地筆記本電腦連接到「服務實例」:轉到x/crypto/ssh - 如何通過堡壘節點建立與私有實例的SSH連接

ssh -t -o ProxyCommand="ssh -i <key> [email protected]<bastion-ip> nc %h %p" -i <key> [email protected]<service-instance-ip> 

我有一個圍棋程序,並希望做以下事情:

  1. SSH連接到從「本地筆記本電腦」的「服務實例」在「堡壘」
  2. 使用連接會話運行一些命令(如「ls -l命令」)從
  3. 上傳文件「本地筆記本電腦「 「服務實例」

我做過嘗試,但沒能實現同樣的過程做

ssh -t -o ProxyCommand="ssh -i <key> [email protected]<bastion-ip> nc %h %p" -i <key> [email protected]<service-instance-ip> 

誰能幫忙告訴我一個例子? 謝謝!

順便說一句,我發現這個: https://github.com/golang/go/issues/6223,這意味着它絕對能夠做到這一點,對吧?

+0

代理轉發並沒有真正有什麼關係這一點,特別是因爲你在命令中指定你的私鑰行(但你真的*應*使用代理和加密密鑰) – JimB

回答

6

如果沒有nc命令,可以使用「x/crypto/ssh」直接執行此操作,因爲有一種方法可以從遠程主機撥號連接並將其顯示爲net.Conn

一旦你有一個ssh.Client,你可以使用Dial方法來獲得你和最終主機之間的虛擬net.Conn。然後,您可以把它轉換成一個新的ssh.Connssh.NewClientConn,並創建一個新ssh.Clientssh.NewClient

// connect to the bastion host 
bClient, err := ssh.Dial("tcp", bastionAddr, config) 
if err != nil { 
    log.Fatal(err) 
} 

// Dial a connection to the service host, from the bastion 
conn, err := bClient.Dial("tcp", serviceAddr) 
if err != nil { 
    log.Fatal(err) 
} 

ncc, chans, reqs, err := ssh.NewClientConn(conn, serviceAddr, config) 
if err != nil { 
    log.Fatal(err) 
} 

sClient := ssh.NewClient(ncc, chans, reqs) 
// sClient is an ssh client connected to the service host, through the bastion host. 
+0

非常感謝!我會盡力在這裏給你反饋。 – Edward

+0

真的很感謝JimB,它工作完美! – Edward

相關問題