OpenSSH是SSH連接工具的免費(fèi)版本。telnet,rlogin和ftp用戶可能還沒意識(shí)到他們?cè)诨ヂ?lián)網(wǎng)上傳輸?shù)拿艽a是未加密的,但SSH是加密的,OpenSSH加密所有通信(包括密碼),有效消除了竊聽,連接劫持和其它攻擊。此外,OpenSSH提供了安全隧道功能和多種身份驗(yàn)證方法,支持SSH協(xié)議的所有版本。
SSH是一個(gè)非常偉大的工具,如果你要在互聯(lián)網(wǎng)上遠(yuǎn)程連接到服務(wù)器,那么SSH無疑是最佳的候選。

一.SSH基礎(chǔ)命令
1.SSH遠(yuǎn)程登錄
假定你要以用戶名root,登錄遠(yuǎn)程主機(jī)192.168.1.104
1.1.口令登錄
需要輸入密碼
# 常用用法
ssh root@192.168.1.104
# 本地用戶名與遠(yuǎn)程用戶名一致,登錄時(shí)可以省略用戶名
ssh 192.168.1.104
# SSH的默認(rèn)端口是22,使用p參數(shù),可以修改這個(gè)端口
ssh -p 2222 root@192.168.1.104
1.2.公鑰登錄

# 生成秘鑰和公鑰
ssh-keygen
# 將公鑰傳送到遠(yuǎn)程主機(jī)host上
# 方法一
ssh-copy-id root@192.168.1.104
# 方法二
ssh root@192.168.1.104 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys' << ~/.ssh/id_rsa.pub
2.通過中間主機(jī)建立SSH連
# 直接連接到只能通過 hostA 連接的 hostB
# hostB 表示從本地網(wǎng)絡(luò)無法直接訪問的主機(jī),但可以從 hostA 所在網(wǎng)絡(luò)訪問
# 這個(gè)命令通過到 hostA 的“隱藏”連接,創(chuàng)建起到 hostB 的連接
ssh -t hostA ssh hostB
3.通過SSH連接屏幕
# 直接連接到遠(yuǎn)程屏幕會(huì)話(節(jié)省了無用的父bash進(jìn)程)
ssh -t root@192.168.1.104 screen –r
# 建立一個(gè)可以重新連接的遠(yuǎn)程GNU screen
ssh -t root@192.168.1.104 screen –xRR
二.SSH遠(yuǎn)程操作
SSH不僅可以用于遠(yuǎn)程主機(jī)登錄,還可以直接在遠(yuǎn)程主機(jī)上執(zhí)行操作
1.SSH數(shù)據(jù)傳輸
1.1.將~/.ssh/目錄下面的所有文件,復(fù)制到遠(yuǎn)程主機(jī)的~/.ssh/目錄
cd && tar czv .ssh | ssh root@192.168.1.104 'tar xz'
1.2.將遠(yuǎn)程主機(jī)~/.ssh/目錄下面的所有文件,復(fù)制到用戶的當(dāng)前目錄
ssh root@192.168.1.104 'tar cz .ssh' | tar zxv
2.通過SSH運(yùn)行復(fù)雜的遠(yuǎn)程shell命令
ssh 192.168.1.104 -l root "cat ~/.ssh/authorized_keys"
3.比較遠(yuǎn)程和本地文件
# 比較本地文件和遠(yuǎn)程文件是否有差異
ssh root@192.168.1.104 "cat ~/.ssh/authorized_keys" | diff ~/.ssh/authorized_keys –
4.通過SSH將MySQL數(shù)據(jù)庫復(fù)制到新服務(wù)器
# 通過壓縮的SSH隧道Dump一個(gè)MySQL數(shù)據(jù)庫,將其作為輸入傳遞給mysql命令
mysqldump –add-drop-table –extended-insert –force –log-error=error.log -uUSER -pPASS OLD_DB_NAME \
| ssh -C user@newhost "mysql -uUSER -pPASS NEW_DB_NAME"
5.實(shí)時(shí)SSH網(wǎng)絡(luò)吞吐量測(cè)試
# 通過SSH連接到主機(jī),顯示實(shí)時(shí)的傳輸速度,將所有傳輸數(shù)據(jù)指向/dev/null,需要先安裝pv
yes | pv | ssh root@192.168.1.104 "cat > /dev/null"
6.scp 跨機(jī)遠(yuǎn)程拷貝
scp是secure copy的簡(jiǎn)寫,用于在Linux下進(jìn)行遠(yuǎn)程拷貝文件的命令,和它類似的命令有cp,不過cp只是在本機(jī)進(jìn)行拷貝不能跨服務(wù)器,而且scp傳輸是加密的??赡軙?huì)稍微影響一下速度。兩臺(tái)主機(jī)之間復(fù)制文件必需得同時(shí)有兩臺(tái)主機(jī)的復(fù)制執(zhí)行帳號(hào)和操作權(quán)限。
6.1.scp命令參數(shù)
- -1 強(qiáng)制scp命令使用協(xié)議ssh1
- -2 強(qiáng)制scp命令使用協(xié)議ssh2
- -4 強(qiáng)制scp命令只使用IPv4尋址
- -6 強(qiáng)制scp命令只使用IPv6尋址
- -B 使用批處理模式(傳輸過程中不詢問傳輸口令或短語)
- -C 允許壓縮。(將-C標(biāo)志傳遞給ssh,從而打開壓縮功能)
- -p 留原文件的修改時(shí)間,訪問時(shí)間和訪問權(quán)限。
- -q 不顯示傳輸進(jìn)度條。
- -r 遞歸復(fù)制整個(gè)目錄。
- -v 詳細(xì)方式顯示輸出。scp和ssh(1)會(huì)顯示出整個(gè)過程的調(diào)試信息。這些信息用于調(diào)試連接,驗(yàn)證和配置問題。
- -c cipher 以cipher將數(shù)據(jù)傳輸進(jìn)行加密,這個(gè)選項(xiàng)將直接傳遞給ssh。
- -F ssh_config 指定一個(gè)替代的ssh配置文件,此參數(shù)直接傳遞給ssh。
- -i identity_file 從指定文件中讀取傳輸時(shí)使用的密鑰文件,此參數(shù)直接傳遞給ssh。
- -l limit 限定用戶所能使用的帶寬,以Kbit/s為單位。
- -o ssh_option 如果習(xí)慣于使用ssh_config(5)中的參數(shù)傳遞方式,
- -P port 注意是大寫的P, port是指定數(shù)據(jù)傳輸用到的端口號(hào)
- -S program 指定加密傳輸時(shí)所使用的程序。此程序必須能夠理解ssh(1)的選項(xiàng)。
6.2.scp一般有六種使用方法
# 本地復(fù)制遠(yuǎn)程文件:(把遠(yuǎn)程的文件復(fù)制到本地)
scp root@192.168.1.104:/test.tar.gz ./test.tar.gz
# 遠(yuǎn)程復(fù)制本地文件:(把本地的文件復(fù)制到遠(yuǎn)程主機(jī)上)
scp ./test.tar.gz root@192.168.1.104:/test.tar.gz
# 本地復(fù)制遠(yuǎn)程目錄:(把遠(yuǎn)程的目錄復(fù)制到本地)
scp -r root@192.168.1.104:/val/test/ /val/test/
# 遠(yuǎn)程復(fù)制本地目錄:(把本地的目錄復(fù)制到遠(yuǎn)程主機(jī)上)
scp -r ./ root@192.168.1.104:/test/datasets
# 本地復(fù)制遠(yuǎn)程文件到指定目錄:(把遠(yuǎn)程的文件復(fù)制到本地)
scp root@192.168.1.104:/val/test/test.tar.gz /val/test/
# 遠(yuǎn)程復(fù)制本地文件到指定目錄:(把本地的文件復(fù)制到遠(yuǎn)程主機(jī)上)
scp /test.tar.gz root@192.168.1.104:/
三.SSH端口操作
1.綁定本地端口
既然SSH可以傳送數(shù)據(jù),那么我們可以讓那些不加密的網(wǎng)絡(luò)連接,全部改走SSH連接,從而提高安全性。
假定我們要讓8080端口的數(shù)據(jù),都通過SSH傳向遠(yuǎn)程主機(jī),命令就這樣寫:
ssh -D 8080 root@192.168.1.104
SSH會(huì)建立一個(gè)socket,去監(jiān)聽本地的8080端口。
一旦有數(shù)據(jù)傳向那個(gè)端口,就自動(dòng)把它轉(zhuǎn)移到SSH連接上面,發(fā)往遠(yuǎn)程主機(jī)??梢韵胂?,如果8080端口原來是一個(gè)不加密端口,現(xiàn)在將變成一個(gè)加密端口。
2.本地端口轉(zhuǎn)發(fā)
假定host1是本地主機(jī),host2是遠(yuǎn)程主機(jī)。由于種種原因,這兩臺(tái)主機(jī)之間無法連通。
但是,另外還有一臺(tái)host3,可以同時(shí)連通前面兩臺(tái)主機(jī)。因此,很自然的想法就是,通過host3,將host1連上host2。
我們?cè)趆ost1執(zhí)行下面的命令:
# ssh -L 本地端口:目標(biāo)主機(jī):目標(biāo)主機(jī)端口
# 連接host1的2121端口,就等于連上了host2的21端口
ssh -L 2121:host2:21 host3
ftp localhost:2121
# 連接host1的9001端口,就等于連上了host2的22端口
ssh -L 9001:host2:22 host3
ssh -p 9001 localhost
3.遠(yuǎn)程端口轉(zhuǎn)發(fā)
既然"本地端口轉(zhuǎn)發(fā)"是指綁定本地端口的轉(zhuǎn)發(fā),那么"遠(yuǎn)程端口轉(zhuǎn)發(fā)"(remote forwarding)當(dāng)然是指綁定遠(yuǎn)程端口的轉(zhuǎn)發(fā)。
還是接著看上面那個(gè)例子,host1與host2之間無法連通,必須借助host3轉(zhuǎn)發(fā)。但是,特殊情況出現(xiàn)了,host3是一臺(tái)內(nèi)網(wǎng)機(jī)器,它可以連接外網(wǎng)的host1,但是反過來就不行,外網(wǎng)的host1連不上內(nèi)網(wǎng)的host3。這時(shí),"本地端口轉(zhuǎn)發(fā)"就不能用了,怎么辦?
解決辦法是,既然host3可以連host1,那么就從host3上建立與host1的SSH連接,然后在host1上使用這條連接就可以了。
我們?cè)趆ost3執(zhí)行下面的命令:
# ssh -R 遠(yuǎn)程主機(jī)端口:目標(biāo)主機(jī):目標(biāo)主機(jī)端口
ssh -R 2121:host2:21 host1
ftp localhost:2121
讓host1監(jiān)聽它自己的2121端口,然后將所有數(shù)據(jù)經(jīng)由host3,轉(zhuǎn)發(fā)到host2的21端口。由于對(duì)于host3來說,host1是遠(yuǎn)程主機(jī),所以這種情況就被稱為"遠(yuǎn)程端口綁定"。
四.SSH的其他參數(shù)
1.N參數(shù),T參數(shù)
表示只連接遠(yuǎn)程主機(jī),不打開遠(yuǎn)程shell;T參數(shù),表示不為這個(gè)連接分配TTY。
這個(gè)兩個(gè)參數(shù)可以放在一起用,代表這個(gè)SSH連接只用來傳數(shù)據(jù),不執(zhí)行遠(yuǎn)程操作。
ssh -NT -D 8080 host
2.f參數(shù),表示SSH連接成功后,轉(zhuǎn)入后臺(tái)運(yùn)行。這樣一來,你就可以在不中斷SSH連接的情況下,在本地shell中執(zhí)行其他操作
# 要關(guān)閉這個(gè)后臺(tái)連接,就只有用kill命令去殺掉進(jìn)程
ssh -f -D 8080 host
問題與支持
- Blog : https://blog.darebeat.cn
- Github: https://github.com/darebeat
- Gitee : https://gitee.com/darebeat