1. 程式人生 > >【轉】SSH穿越跳板機:一條命令跨越跳板機直接登陸遠程計算機

【轉】SSH穿越跳板機:一條命令跨越跳板機直接登陸遠程計算機

spa 適合 這樣的 跳板 封裝 直接 windows lai 必須

轉自:http://mingxinglai.com/cn/2015/07/ssh-proxycommand/

今天在公司搭建跳板機,遇到一個比較麻煩的問題,這裏簡單記錄一下,希望對有相同問題的人有所幫助。

我們公司的線上機器是下圖這樣的,A是我們本地的計算機,一般是windows系統,B是跳板機,C是目標機器,我們需要登錄線上機器時,必須先登錄跳板機,再登錄目標機器。

+-----+             +-----+             +-----+
|     |             |     |             |     |
|  A  +-----------> |  B  +-----------> |  C  |
|     |             |     |             |     |
+-----+             +-----+             +-----+

註意:我們使用了ssh-agent轉發功能,私鑰只需要存在A上,B和C都只存放公鑰,然後就可以先登錄B,再登錄C。

由於大家都是在windows下辦公,對於這種先登錄跳板機再登錄目標機器的方式並沒有不滿,但是,我們管理的機器網絡結構越來越復雜了,變成了下面這樣。我就不解釋為什麽我們公司會存在這麽復雜的架構了,總之,在安全性與易用性之間,總是不能同時滿足的,作為一線工程師,只能想辦法在保證安全性的前提下,提高工作效率了。

+-----+             +-----+             +-----+             +-----+
|     |             |     |             |     |             |     |
|  A  +-----------> |  B  +-----------> |  C  +-----------> |  D  |
|     |             |     |             |     |             |     |
+-----+             +-----+             +-----+             +-----+

現在只希望能夠在B直接跳到D,就像以前從B跳到C一樣,不需要先跳到C,再跳到D這麽麻煩,尤其在傳文件的時候,如果需要先將文件傳到C,再從C傳到D,工作效率極低,並且容易出錯。

+-----+             +-----+             +-----+             +-----+
|     |             |     |             |     |             |     |
|  A  +-----------> |  B  +-------------------------------> |  D  |
|     |             |     |             |     |             |     |
+-----+             +-----+             +-----+             +-----+

搜了很久,在這裏找到比較好的答案。

直接編輯~/.ssh/config文件,增加ProxyCommand選項,像下面這樣:

Host target.machine
    User          targetuser
    HostName      target.machine
    ProxyCommand  ssh [email protected].machine nc %h %p 2> /dev/null

註意:~/.ssh/config文件有很多amazing的選項,具體可以參考這裏:http://blog.tjll.net/ssh-kung-fu

現在,只需要通過下面這樣簡單的語句登陸遠程計算機:

ssh target.machine

還可以直接SCP過去,跳板機完全透明:

scp ToCopy.txt target.machine:~

大部分人到這一步就算大功告成了,但是,其實我們公司的網絡架構是這樣的:

                                         +-----+             +-----+
                                         |     |             |     |
                        +----------------------------------> |  D1 |
                        |                |     |             |     |
                        |                +-----+             +-----+
                        |
                        |
+-----+              +--+--+             +-----+             +-----+
|     |              |     |             |     |             |     |
|  A  +------------> |  B  +-------------------------------> |  D2 |
|     |              |     |             |     |             |     |
+-----+              +--+--+             +-----+             +-----+
                        |
                        |
                        |                +-----+             +-----+
                        |                |     |             |     |
                        +----------------------------------> |  D3 |
                                         |     |             |     |
                                         +-----+             +-----+

如圖所示,我們有無數的跳板機,每臺跳板機後面有若幹臺機器,因此,不適合編輯~/.ssh/ssh_config文件,需要用腳本進行封裝,因此,我像下面這樣使用ProxyCommand:

  • 直接跳到遠程計算機

      ssh -o "ProxyCommand ssh -p 1098 [email protected] nc -w 1 %h %p" -p 1098 [email protected].machine
  • 拷貝文件到遠程計算機

      scp -o "ProxyCommand ssh -p 1098 [email protected] nc -w 1 %h %p" -P 1098 -r [email protected].machine:~/rdsAgent .
  • 在遠程計算機執行命令

      ssh -o "ProxyCommand ssh -p 1098 [email protected] nc -w 1 %h %p" -p 1098 [email protected].machine ‘ip a‘

【轉】SSH穿越跳板機:一條命令跨越跳板機直接登陸遠程計算機