轉自:http://mingxinglai.com/cn/2015/07/ssh-proxycommand/windows
今天在公司搭建跳板機,遇到一個比較麻煩的問題,這裏簡單記錄一下,但願對有相同問題的人有所幫助。安全
咱們公司的線上機器是下圖這樣的,A是咱們本地的計算機,通常是windows系統,B是跳板機,C是目標機器,咱們須要登陸線上機器時,必須先登陸跳板機,再登陸目標機器。網絡
+-----+ +-----+ +-----+ | | | | | | | A +-----------> | B +-----------> | C | | | | | | | +-----+ +-----+ +-----+
注意:咱們使用了ssh-agent轉發功能,私鑰只須要存在A上,B和C都只存放公鑰,而後就能夠先登陸B,再登陸C。架構
因爲你們都是在windows下辦公,對於這種先登陸跳板機再登陸目標機器的方式並無不滿,可是,咱們管理的機器網絡結構愈來愈複雜了,變成了下面這樣。我就不解釋爲何咱們公司會存在這麼複雜的架構了,總之,在安全性與易用性之間,老是不能同時知足的,做爲一線工程師,只能想辦法在保證安全性的前提下,提升工做效率了。ssh
+-----+ +-----+ +-----+ +-----+ | | | | | | | | | A +-----------> | B +-----------> | C +-----------> | D | | | | | | | | | +-----+ +-----+ +-----+ +-----+
如今只但願可以在B直接跳到D,就像之前從B跳到C同樣,不須要先跳到C,再跳到D這麼麻煩,尤爲在傳文件的時候,若是須要先將文件傳到C,再從C傳到D,工做效率極低,而且容易出錯。spa
+-----+ +-----+ +-----+ +-----+ | | | | | | | | | A +-----------> | B +-------------------------------> | D | | | | | | | | | +-----+ +-----+ +-----+ +-----+
搜了好久,在這裏找到比較好的答案。.net
直接編輯~/.ssh/config文件,增長ProxyCommand選項,像下面這樣:code
Host target.machine User targetuser HostName target.machine ProxyCommand ssh proxyuser@proxy.machine nc %h %p 2> /dev/null
注意:~/.ssh/config文件有不少amazing的選項,具體能夠參考這裏:http://blog.tjll.net/ssh-kung-fublog
如今,只須要經過下面這樣簡單的語句登錄遠程計算機:ip
ssh target.machine
還能夠直接SCP過去,跳板機徹底透明:
scp ToCopy.txt target.machine:~
大部分人到這一步就算大功告成了,可是,其實咱們公司的網絡架構是這樣的:
+-----+ +-----+ | | | | +----------------------------------> | D1 | | | | | | | +-----+ +-----+ | | +-----+ +--+--+ +-----+ +-----+ | | | | | | | | | A +------------> | B +-------------------------------> | D2 | | | | | | | | | +-----+ +--+--+ +-----+ +-----+ | | | +-----+ +-----+ | | | | | +----------------------------------> | D3 | | | | | +-----+ +-----+
如圖所示,咱們有無數的跳板機,每臺跳板機後面有若干臺機器,所以,不適合編輯~/.ssh/ssh_config文件,須要用腳本進行封裝,所以,我像下面這樣使用ProxyCommand:
直接跳到遠程計算機
ssh -o "ProxyCommand ssh -p 1098 lmx@proxy.machine nc -w 1 %h %p" -p 1098 lmx@target.machine
拷貝文件到遠程計算機
scp -o "ProxyCommand ssh -p 1098 lmx@proxy.machine nc -w 1 %h %p" -P 1098 -r lmx@target.machine:~/rdsAgent .
在遠程計算機執行命令
ssh -o "ProxyCommand ssh -p 1098 lmx@proxy.machine nc -w 1 %h %p" -p 1098 lmx@target.machine 'ip a'