接著前一次的文章,繼續介紹SSH的用法。
=======================================
SSH原理與運用(二):遠端操作與埠轉發
作者:阮一峰
(Image credit: Tony Narlock)
七、遠端操作
SSH不僅可以用於遠端主機登入,還可以直接在遠端主機上執行操作。
上一節的操作,就是一個例子:
$ ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
單引號中間的部分,表示在遠端主機上執行的操作;後面的輸入重定向,表示資料通過SSH傳向遠端主機。
這就是說,SSH可以在使用者和遠端主機之間,建立命令和資料的傳輸通道,因此很多事情都可以通過SSH來完成。
下面看幾個例子。
【例1】
將$HOME/src/目錄下面的所有檔案,複製到遠端主機的$HOME/src/目錄。
$ cd && tar czv src | ssh user@host 'tar xz'
【例2】
將遠端主機$HOME/src/目錄下面的所有檔案,複製到使用者的當前目錄。
$ ssh user@host 'tar cz src' | tar xzv
【例3】
檢視遠端主機是否執行程式httpd。
$ ssh user@host 'ps ax | grep [h]ttpd'
八、繫結本地埠
既然SSH可以傳送資料,那麼我們可以讓那些不加密的網路連線,全部改走SSH連線,從而提高安全性。
假定我們要讓8080埠的資料,都通過SSH傳向遠端主機,命令就這樣寫:
$ ssh -D 8080 user@host
SSH會建立一個socket,去監聽本地的8080埠。一旦有資料傳向那個埠,就自動把它轉移到SSH連線上面,發往遠端主機。可以想象,如果8080埠原來是一個不加密埠,現在將變成一個加密埠。
九、本地埠轉發
有時,繫結本地埠還不夠,還必須指定資料傳送的目標主機,從而形成點對點的"埠轉發"。為了區別後文的"遠端埠轉發",我們把這種情況稱為"本地埠轉發"(Local forwarding)。
假定host1是本地主機,host2是遠端主機。由於種種原因,這兩臺主機之間無法連通。但是,另外還有一臺host3,可以同時連通前面兩臺主機。因此,很自然的想法就是,通過host3,將host1連上host2。
我們在host1執行下面的命令:
$ ssh -L 2121:host2:21 host3
命令中的L引數一共接受三個值,分別是"本地埠:目標主機:目標主機埠",它們之間用冒號分隔。這條命令的意思,就是指定SSH繫結本地埠2121,然後指定host3將所有的資料,轉發到目標主機host2的21埠(假定host2執行FTP,預設埠為21)。
這樣一來,我們只要連線host1的2121埠,就等於連上了host2的21埠。
$ ftp localhost:2121
"本地埠轉發"使得host1和host3之間彷彿形成一個資料傳輸的祕密隧道,因此又被稱為"SSH隧道"。
下面是一個比較有趣的例子。
$ ssh -L 5900:localhost:5900 host3
它表示將本機的5900埠繫結host3的5900埠(這裡的localhost指的是host3,因為目標主機是相對host3而言的)。
另一個例子是通過host3的埠轉發,ssh登入host2。
$ ssh -L 9001:host2:22 host3
這時,只要ssh登入本機的9001埠,就相當於登入host2了。
$ ssh -p 9001 localhost
上面的-p參數列示指定登入埠。
十、遠端埠轉發
既然"本地埠轉發"是指繫結本地埠的轉發,那麼"遠端埠轉發"(remote forwarding)當然是指繫結遠端埠的轉發。
還是接著看上面那個例子,host1與host2之間無法連通,必須藉助host3轉發。但是,特殊情況出現了,host3是一臺內網機器,它可以連線外網的host1,但是反過來就不行,外網的host1連不上內網的host3。這時,"本地埠轉發"就不能用了,怎麼辦?
解決辦法是,既然host3可以連host1,那麼就從host3上建立與host1的SSH連線,然後在host1上使用這條連線就可以了。
我們在host3執行下面的命令:
$ ssh -R 2121:host2:21 host1
R引數也是接受三個值,分別是"遠端主機埠:目標主機:目標主機埠"。這條命令的意思,就是讓host1監聽它自己的2121埠,然後將所有資料經由host3,轉發到host2的21埠。由於對於host3來說,host1是遠端主機,所以這種情況就被稱為"遠端埠繫結"。
繫結之後,我們在host1就可以連線host2了:
$ ftp localhost:2121
這裡必須指出,"遠端埠轉發"的前提條件是,host1和host3兩臺主機都有sshD和ssh客戶端。
十一、SSH的其他引數
SSH還有一些別的引數,也值得介紹。
N引數,表示只連線遠端主機,不開啟遠端shell;T引數,表示不為這個連線分配TTY。這個兩個引數可以放在一起用,代表這個SSH連線只用來傳資料,不執行遠端操作。
$ ssh -NT -D 8080 host
f引數,表示SSH連線成功後,轉入後臺執行。這樣一來,你就可以在不中斷SSH連線的情況下,在本地shell中執行其他操作。
$ ssh -f -D 8080 host
要關閉這個後臺連線,就只有用kill命令去殺掉程式。
十二、參考文獻
* SSH, The Secure Shell: The Definitive Guide: 2.4. Authentication by Cryptographic Key, O'reilly
* SSH, The Secure Shell: The Definitive Guide: 9.2. Port Forwarding, O'reilly
* Shebang: Tips for Remote Unix Work (SSH, screen, and VNC)
* brihatch: SSH Host Key Protection
* brihatch: SSH User Identities
* IBM developerWorks: 實戰 SSH 埠轉發
* Jianing YANG:ssh隧道技術簡介
* WikiBooks: Internet Technologies/SSH
* Buddhika Chamith: SSH Tunneling Explained