ssh是一種網路協議,用於計算機之間的加密登入。如果乙個使用者從本地計算機,使用ssh協議登入另一台遠端計算機,我們就可以認為,這種登入是安全的,即使被中途截獲,密碼也不會洩露。
最早的時候,網際網路通訊都是明文通訊,一旦被截獲,內容就暴露無疑。2023年,芬蘭學者tatu ylonen設計了ssh協議,將登入資訊全部加密,成為網際網路安全的乙個基本解決方案,迅速在全世界獲得推廣,目前已經成為linux系統的標準配置。
ssh user@host_ip //以使用者名稱user,登入遠端主機
ssh host_ip //如果本地使用者名與遠端使用者名稱一致,登入時可以省略使用者名稱
ssh -p 2222 user@host_ip
//ssh的預設埠是22,使用p引數,可以修改這個埠。上面這條命令表示,ssh直接連線遠端主機的2222埠
用於計算機之間的加密登入。
例一:口令登入遠端主機
$ ssh user@host_ip
the authenticity of host 'host (12.18.429.21)' can't be established.
rsa key fingerprint is 98:2e:d7:e0:de:9f
:ac:67:28:c2:42:2d:37:16:58:4d.
are you sure you want to continue connecting (yes/no)?
warning: permanently added 'host,12.18.429.21' (rsa) to the list of known hosts.
password: (enter password)
說明:上文意思是,無法確認host主機的真實性,只知道它的公鑰指紋,問你還想繼續連線嗎?所謂」公鑰指紋」,是指公鑰長度較長(這裡採用rsa演算法,長達1024位),很難比對,所以對其進行md5計算,將它變成乙個128位的指紋。上例中是98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d,再進行比較,就容易多了。很自然的乙個問題就是,使用者怎麼知道遠端主機的公鑰指紋應該是多少?沒有好辦法,遠端主機必須在自己的**上貼出公鑰指紋,以便使用者自行核對。假定經過風險衡量以後,使用者決定接受這個遠端主機的公鑰。系統會出現一句提示,表示host主機已經得到認可。然後,會要求輸入密碼。如果密碼正確,就可以登入了。當遠端主機的公鑰被接受以後,它就會被儲存在檔案$home/.ssh/known_hosts
之中,下次再連線這台主機,系統就會認出它的公鑰已經儲存在本地了,從而跳過警告部分,直接提示輸入密碼。每個ssh使用者都有自己的known_hosts檔案,此外系統也有乙個這樣的檔案,通常是/etc/ssh/ssh_known_hosts,儲存一些對所有使用者都可信賴的遠端主機的公鑰。
例二:公鑰登入遠端主機
命令:
$ cd
$ ssh-keygen
// 在本地$home/.ssh/目錄下,生成兩個新檔案:id_rsa.pub(公鑰)和id_rsa(私鑰)
$ ssh-copy-id user@host
//將本地使用者的公鑰id_rsa.pub(一段字串),傳送到遠端主機$home/.ssh/下,只要把它追加在authorized_keys檔案的末尾
$ ssh user@host_ip
//直接登陸遠端主機,不用輸入口令
如果還是不能遠端登陸,則需要開啟遠端主機的/etc/ssh/sshd_config檔案,檢查下面幾行前的「#」注釋是否去掉,然後重啟遠端主機的ssh服務。
# more /etc/ssh/sshd_config
rsaauthentication yes
pubkeyauthentication yes
authorizedkeysfile .ssh/authorized_keys
# service ssh restart
//ubuntu係用,redhat系也可用systemctl restart sshd,debian系可用/etc/init.d/ssh restart
說明:執行ssh-copy-id user@host
以後,系統會出現一系列提示,可以一路回車。其中有乙個問題是,要不要對私鑰設定口令(passphrase),如果擔心私鑰的安全,可以設定乙個。
另外,如果不使用上面的ssh-copy-id
,而改用下面的命令,則可以解釋公鑰的儲存過程:
$ ssh user@host
'mkdir -p .ssh && cat >> .ssh/authorized_keys'
< ~/.ssh/id_rsa.pub
這條命令由多個語句組成,依次分解開來看:
例三:在本地命令列,操作遠端主機
命令:
$ cd && tar czv src | ssh user@host_ip 'tar xz'
//將$home/src/目錄下的所有檔案,先壓縮成*.tar.gz檔案,再複製並解壓到遠端主機的$home/src/下(預設與本地使用者相同的主目錄)
$ ssh user@host_ip 'tar cz src' | tar xzv
//將遠端主機$home/src/目錄下面的所有檔案,先壓縮成*.tar.gz檔案,再複製並解壓到本地使用者的當前目錄
//檢視遠端主機是否執行httpd程序
說明:ssh不僅可以登入遠端主機,還可以在使用者和遠端主機之間,建立命令和資料的傳輸通道,在本地命令列操作遠端主機。
例四:繫結本地埠
$ ssh -d
8080 user@host_ip //讓本地8080埠的資料,通過ssh協議傳向遠端主機
說明:既然ssh可以傳送資料,那麼我們可以讓那些不加密的網路連線,全部改走ssh連線,從而提高安全性。ssh會建立乙個socket,監聽本地的8080埠。一旦有資料傳向那個埠,socket就自動把它轉移到ssh連線上面,發往遠端主機。這樣,8080埠就從乙個不加密埠變成乙個加密埠。
例五:本地埠**
場景:假定host1是本地主機,host2是遠端主機,由於種種原因,兩台主機之間無法連通。但是,還有一台host3可以同時連通前兩台主機。但是,我們可以通過host3,將host1連上host2。
$ ssh -l 2121:host2_ip:21 host3_ip
// 將本地主機的2121埠,通過host1與host3、host3與host2的ssh連線,**到host2的21埠
$ ftp host1_ip:2121
// 連線host1的2121埠,就等於連上了host2的21埠。
$ ssh -l
5900:host3_ip:
5900 host3_ip
// 將本地host1的5900埠,**到遠端主機host3的5900埠。"本地埠**"使得host1和host3之間彷彿形成乙個資料傳輸的秘密隧道,因此又被稱為"ssh隧道"。
$ ssh -l
9001:host2_ip:22 host3_ip
// 將本地主機ssh埠9001通過host3的ssh埠,**到host2的22埠(ssh協議)
$ ssh -p
9001 localhost_ip
// ssh登入本機的9001埠,就相當於登入host2的22埠
例六:遠端埠**
場景:host1是外網主機,host2、host3是內網主機,host1與host2之間不互通,必須借助host3**。但是,特殊情況出現了,host3是一台內網主機,它可以連線外網host1,但是外網host1連不上內網host3。這時,」本地埠**」就不能用了,需要使用」遠端埠**」(remote forwarding),即繫結遠端埠的**。在host3上執行:
$ ssh -r 2121:host2:21 host1_ip
// 讓host1監聽它自己的2121埠,然後把host1的資料經過host3與host1連線,host3與host2的連線,**到host2的21埠
$ ftp localhost_ip:2121
//在host1上連線host2
「遠端埠**」的前提條件是,host1和host3兩台主機都有sshd守護程序和ssh客戶端。
例七:ssh連線只用來傳資料,不執行遠端操作
命令:
$ ssh -nt
-d8080 host_ip
//將本地8080埠繫結到ssh連線上,會話只用來傳資料,不執行遠端操作
$ ssh -f
-d8080 host_ip //用kill命令殺掉程序,關閉這個後台連線
ssh原理與運用(一):遠端登入
ssh原理與運用(二):遠端操作與埠**
每天乙個Linux命令
將我遇到的linux指令總結一下,不斷增加 1 sz和rz 一般來說,linux 伺服器大多是通過 ssh客戶端來進行遠端的登陸和管理的,使用 ssh登陸 linux ssh有關的兩個命令可以提供很方便的操作 sz 將選定的檔案傳送 send 到本地機器 rz 執行該命令會彈出乙個檔案選擇視窗,從本...
每天乙個linux命令
linux cmp命令 linux cmp命令用於比較兩個檔案是否有差異。當相互比較的兩個檔案完全一樣時,則該指令不會顯示任何資訊。若發現有所差異,缺省會標示出第乙個不同之處的字元和列數編號。若不指定任何檔名稱或是所給予的檔名為 則cmp指令會從標準輸入裝置讀取資料。語法cmp clsv i 字元數...
每天乙個 Linux 命令
head 與 tail 就像它的名字一樣的淺顯易懂,它是用來顯示開頭或結尾某個數量的文字區塊,head 用來顯示檔案的開頭至標準輸出中,而 tail 想當然爾就是看檔案的結尾。1 命令格式 head 引數 檔案 2 命令功能 head 用來顯示檔案的開頭至標準輸出中,預設head命令列印其相應檔案的...