SSH – https://benjr.tw/301 ,不只只是取代 Telnet 的功能還有很多特異功能,下面一項項來看一下.
SFTP
SSH 本身就提供 ftp 的功能,它還是使用 22 port(22 port 走的是SSH 加密的傳輸,而不是使用 ftp 預設的 21 port) ,Client 端只要使用指令 sftp 就可以以 ftp 的方式連到遠方的 SSH Server ,並且可以像是使用 FTP 方式來傳送檔案了.
[root@benjr ~]# sftp 10.6.101.42 The authenticity of host ’10.6.101.42 (10.6.101.42)’ can’t be established. RSA key fingerprint is 36:cb:6c:82:9e:08:c4:a3:2d:f7:f7:39:54:d0:e2:19. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added ’10.6.101.42′ (RSA) to the list of known hosts. root@10.6.101.42′s password:
選擇 yes 則表示 client 接受 server 的公開主機金鑰,因為我們沒有建立使用者金鑰,伺服器會提示使用者輸入正確的標準 Unix 使用者密碼..
sftp 依據目前的使用者來登入,如果使用者為 root 遠端 sftp 會自動把 root 當成遠端登入的預設帳號,如要使用不同的帳號登入請在 IP 前指定使用者 ex #sftp ben@10.6.101.42
[root@benjr ~]# sftp ben@10.6.101.42
SCP
scp 的功能類似於 rcp ,但較為安全他的語法如下
[root@benjr ~]# scp [options] sourcefilestring destfilestring
拷貝檔案至遠端 10.6.101.123 的 /root 目錄下
[root@benjr ~]# scp source.txt 10.6.101.123:/root/ root@10.6.101.123′s password: source.txt 100% 22 238.7KB/s 00:00
scp 依據目前的使用者來登入,如果使用者為 root 遠端 scp 會自動把 root 當成遠端登入的預設帳號,如要使用不同的帳號登入請在 IP 前指定使用者 ex ben@10.6.101.123
[root@benjr ~]# scp source.txt ben@10.6.101.123:/root/
Windows 底下也有 3-party 的 scp 軟體 WSCP(windows Secure copy)
轉送 X session
預設登入 SSH 時,就可以將 XWindow 執行的畫面傳回本地端,如果不行檢查一下你的 /etc/ssh/sshd_config 中 X11Forwarding 是否設為 yes(OpenSSH 2.X版預設值為 no)
[root@benjr ~]# ssh -X remote_IP
-X(大寫,Enables X11 forwarding),接下來我們會進入遠端,並將遠端執行的程式在目前螢幕顯示出來。
[root@remote_IP ~]# xeyes &
你可以看到遠端所執行的程式,在 Local 端顯示出來。
其他的 Port 轉送
看這一篇你需要先具有 TCP/IP 的相關觀念,不了解的可以參考 Study-Area 反正你可以把 IP 看成街上不同的百貨公司,而 port 就是每家百貨公司裡面的專櫃,每個專櫃提供不同的服務給使用者. Linux 是由 Unix 系統改過來的,而 Unix 系統的年代也已經久遠,所以存在一些服務是沒經過加密,以明文傳送(如:Telnet…),或只是使用一些簡單的協定來傳送(如:POP3…),這些在網路上傳送的重要資訊都有可能被別人擷取,而透過 SSH 可以將這些 Port 的服務做轉送使用這些協定,使這些協定就像是經過一個安全通道(Secure tunnel)來傳送.先來看下面這個例子:
讓 Telnet 協定經由 SSH 的保護來傳送:
Client 端 IP:10.6.101.123
[root@client ~]# ssh -2 -L 1234:10.6.101.84:23 -f root@10.6.101.84 sleep 600
說明:
- ssh -2 就是使用 SSH 協定 V.2
- -L 就定義了 port 的轉送,其語法是 local_port_number:remote_hostname:remote_port_number
local_port_number:本地端的任意 port
remote_hostname:遠端的伺服器名稱或 IP
remote_port_number:你要轉送的遠端的 port
- -f 會去執行 sleep 600 然後就把 SSH 轉到背景去執行,這樣會造成 SSH 只會在背景存活 600 秒!也就是說這一個連線在 600 秒後就會失效.
- root@10.6.101.84 指示 SSH 使用這個身份去建立 SSH 的連線通道!只有使用 root 身份才能建立 <1024 port 的連線.
看不懂吧!!!當初我也是傻這裡很久!!! 沒關係,我們直接來看看 TCP /IP 建立了哪些連線
[root@client ~]# netstat -tlnpa Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:1234 0.0.0.0:* LISTEN 5038/ssh tcp 0 0 10.6.101.123:32777 10.6.101.84:22 ESTABLISHED 5038/ssh
我只列出和我們指令相關的連線
Client 是如何和 server 建立連線的,如 #telnet 10.6.101.84,Server 端是用 port 23 來向 client 建立連線,那 Client 是怎麼用什麼 port 來建立連線,通常系統會任意取用 > 1024 的 port 來建立連線,所以上面的指令建立的連線就有可能像這樣.
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 10.6.101.123:32778 10.6.101.84:23 ESTABLISHED 5068/telnet
同樣的 Server 也會看到相同的連線.
回到主題你可以看到 127.0.0.1:1234 和 10.6.101.123:32777 這兩個 PID 都是一樣的,也就是說傳給 10.6.101.123:32777 的資料到最後會回到 127.0.0.1:1234 ,而 10.6.101.123:32777 的確是和 server 經由SSH 的傳送,也是用10.6.101.84:22 來連接.
Server端 IP:10.6.101.84
[root@server ~]# netstat -tlnpa Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 10.6.101.84:22 10.6.101.123:32777 ESTABLISHED 6226/sshd: root@not
這時候我們看看 Server 建立了哪些連線,我只列出和我們指令相關的連線,這裡我們只會看到一個 SSH 的連線.
Client 端 IP:10.6.101.123
所以此時 Telnet 的連線要透過本地的 127.0.0.1:1234 ,所以指令會變成這樣.
[root@client ~]# telnet 127.0.0.1 1234
這時候我們看看 Client 建立了哪些連線,我只列出和我們指令相關的連線.
[root@client ~]# netstat -tlnpa Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:1234 0.0.0.0:* LISTEN 5111/ssh tcp 0 0 10.6.101.123:32777 10.6.101.84:22 ESTABLISHED 5111/ssh tcp 0 0 127.0.0.1:1234 127.0.0.1:32777 ESTABLISHED 5111/ssh tcp 0 0 127.0.0.1:32777 127.0.0.1:1234 ESTABLISHED 5112/telnet
除了剛才的連線外還多出了 127.0.0.1:1234–>127.0.0.1:32777,127.0.0.1:32777–>127.0.0.1:1234 這兩個連線,這就是 telnet 127.0.0.1 1234 所建立的.請你把 127.0.0.1 1234 當成一般 IP 建立連線時.你就不會覺得奇怪了!剛才講過給 10.6.101.123:32777 的資料到最後會回到 127.0.0.1:1234 .
Server端 IP:10.6.101.84
[root@server ~]# netstat -tlnpa Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 10.6.101.84:22 10.6.101.123:32777 ESTABLISHED 6226/sshd: root@not tcp 0 0 10.6.101.84:32776 10.6.101.84:23 ESTABLISHED 6226/sshd: root@not tcp 0 0 10.6.101.84:23 10.6.101.84:32776 ESTABLISHED 6235/in.telnetd: td
我只列出和我們指令相關的連線 ,這裡我們會看到原先建立的 SSH 連線還有PID=6226 又生出 10.6.101.84:32776–>10.6.101.84:23 這個連線,並且與 10.6.101.84:23—>10.6.101.84:32776 相連線,就是 PID 6226 用本身自己產生的子行程 10.6.101.84:32776 與 Telnet 相連.因此 10.6.101.123:32780 與 10.6.101.84:32776 的資料會相通.
可能看下面的圖會更清楚
對 Client 而言 127.0.0.1:1234 才是 Telnet Server ,在 Server 端於本地端的 10.6.101.84:32776 與真正的 Telnet Server 建立連線.
其他如 POP3(使用 port 110) 也是可以用這方法來做
[root@benjr ~]# ssh -2 -f root@10.6.101.84 -L 7777:10.6.101.84:110 sleep 600
但是要記的設定 pop3 的伺服器為 127.0.01 而 port 為 7777
note:
除了可以使用參數- L 你也可以使用 -R 來設定.
ssh2 -R 1234:localhost:23 username@host
下面是他的原文說明
all traffic which comes to port 1234 on the server (host) will be forwarded to port 23 on the client (localhost).
It is important to realize that if you have three hosts, client, sshdserver, and appserver, and you forward the traffic coming to the client’s port x to the appserver’s port y, only the connection between the client and sshdserver will be secured. See Figure Forwarding to a third host. The command you use would be something like the following:
如果你的 SSH 要轉送的 services 不在同一台機器上,你的指令可以這樣下
[root@benjr ~]# ssh2 -L x:appserver:y username@sshdserver
4 thoughts on “Linux – SSH 應用”