每天一個 Linux 命令: ssh 命令

1. 命令簡介

ssh(Secure SHell)命令是 OpenSSH:https://www.openssh.com 套件的組成部分,是遠程登錄服務 SSH 的客戶端程序,用於登錄遠程主機。

ssh 是一個用於登錄到遠程機器並在遠程機器上執行命令的程序。它的目的是取代 rloginrsh,並在一個不安全的網絡上提供兩個不受信任的主機之間的安全加密通信。X11 連接和任意 TCP 端口也可以通過安全通道進行轉發。

2. 命令格式

ssh [OPTIONS] [-p PORT] [USER@]HOSTNAME [COMMAND]

ssh 最常用的功能是登錄遠程主機,選擇以什麼用戶連接哪臺機器,然後輸入密碼即可。

3. 選項說明

-1
    強制只使用協議第一版
-2
    強制只使用協議第二版
-4
    強制只使用 IPv4 地址.
-6
    強制只使用 IPv6 地址
-A
    允許轉發認證代理的連接。可以在配置文件中對每個主機單獨設定這個參數
-a
    禁止轉發認證代理的連接
-b BIND_ADDRESS
    在擁有多個地址的本地機器上,指定連接的源地址
-C
 壓縮所有數據。壓縮算法與 gzip(1) 使用的相同
-c {blowfish | 3des | des}
    選擇會話的密碼算法。3des 是默認算法
-c CIPHER_SPEC
    另外, 對於協議第二版,這裏可以指定一組用逗號隔開、按優先順序排列的加密算法
-D [BIND_ADDRESS:]PORT
 指定一個本地主機動態的應用程序級的轉發端口。工作原理是這樣的,本地機器上分配了一個 socket 偵聽 port 端口,一旦這個端口上有了連接,該連接就經過安全通道轉發出去,根據應用程序的協議可以判斷出遠程主機將和哪裏連接。目前支持 SOCKS4 和 SOCKS5 協議,而 ssh 將充當 SOCKS 服務器. 只有 root 才能轉發特權端口。可以在配置文件中指定動態端口的轉發
-e ESCAPE_CHAR
 設置 pty 會話的轉義字符,默認爲字符 ~。轉義字符只在行首有效,轉義字符後面跟一個點表示結束連接,後跟一個 control-Z 表示掛起連接,跟轉義字符自己表示輸出轉義字符自身。把轉義字符設爲 none 則禁止 轉義功能,使會話完全透明
-F CONFIGFILE
 指定 ssh 指令的配置文件,將忽略系統級配置文件 /etc/ssh/ssh_config 和用戶級配置文件 ~/.ssh/config
-f 
    ssh 在執行命令前退至後臺
-g
    允許遠端主機連接本地的轉發端口
-I SMARTCARD_DEVICE
    指定智能卡設備。智能卡里面存儲了用戶的 RSA 私鑰
-i IDENTITY_FILE
    指定一個 RSA 或 DSA 認證所需的身份(私鑰)文件。協議第一版的默認文件是 ~/.ssh/identity 以及協議第二版的 ~/.ssh/id_rsa 和 ~/.ssh/id_dsa 文件。可以同時使用多個 -i 選項,也可以在配置文件中指定多個身份文件
-K
 啓用基於 GSSAPI 的身份驗證和向服務器轉發 GSSAPI 憑據
-k
   禁用向服務器轉發 GSSAPI 憑據
-L [BIND_ADDRESS:]PORT:HOST:HOSTPORT
 將本地主機的地址和端口接收到的數據通過安全通道轉發給遠程主機的地址和端口
-l LOGIN_NAME
    指定登錄遠程主機的用戶。可以在配置文件中對每個主機單獨設定這個參數
-M
 將 ssh 客戶端置於主模式進行連接共享。多個 -M 選項將 ssh 置於主模式,並在接受從連接之前進行確認
-m MAC_SPEC
 對於協議第二版,可以指定一組用逗號隔開,按優先順序排列的 MAC (message authentication code) 算法
-N
    不執行遠程命令,用於轉發端口。僅限協議第二版
-n
 把 stdin 重定向到 /dev/null,防止從 stdin 讀取數據。在後臺運行時一定會用到這個選項
-O CTL_CMD
 控制主動連接多路複用主進程。參數 CTL_CMD 將被傳遞給主進程。CTL_CMD 可取值 check(檢查主進程是否正在運行)和 exit(讓主進程退出)
-o OPTION
    可以在這裏給出某些選項,格式和配置文件中的格式一樣。它用來設置那些沒有單獨的命令行標誌的選項
-p PORT
    指定遠程主機的端口。可以在配置文件中對每個主機單獨設定這個參數
-q
    安靜模式。消除大多數的警告和診斷信息
-R [BIND_ADDRESS:]PORT:HOST:HOSTPORT
 將遠程主機上的地址和端口接收的數據通過安全通道轉發給本地主機的地址和端口
-S CTL_PATH
 指定用於連接共享的控制套接字的位置
-s
    用於請求遠程系統上的子系統調用。子系統是 SSH2 協議的一個特性,它有助於將 SSH 用作其他應用程序(如 sftp(1))的安全傳輸。子系統通過遠程命令指定
-T
    禁止分配僞終端
-t
 強制分配僞終端。這可用於在遠程計算機上執行基於屏幕的任意程序,例如菜單服務。多個 -t  選項強制分配終端, 即使沒有本地終端
-V
 顯示版本信息並退出
-v
    冗詳模式。打印關於運行情況的調試信息。在調試連接、認證和配置問題時非常有用。多個 -v 選項能夠增加冗詳程度,最多三個
-W HOST:PORT
 將客戶端上的標準輸入和輸出通過安全通道轉發給指定主機的端口
-w LOCAL_TUN[:REMOTE_TUN]
 指定客戶端和服務端之間轉發的隧道設備
-X
    允許 X11 轉發,可以在配置文件中對每個主機單獨設定這個參數
-x
    禁止 X11 轉發
-Y
 啓用受信任的 X11 轉發。受信任的 X11 轉發不受 X11 安全擴展控制的約束
-y
 使用 syslog(3) 系統模塊發送日誌信息。默認情況下,此信息被髮送到 stderr

4. 常用示例

(1)使用指定用戶名和端口登錄遠程主機。

ssh -p3600 root@9.134.114.170

輸入用戶登錄密碼後完成登錄。未指明端口和用戶名,則分別由配置文件 ~/.ssh/ssh_config 和 /etc/ssh/ssh_config 中的 Port 和 User 選項決定。如果配置文件未指定,則端口默認爲 22 ,用戶名默認爲當前用戶。

注意:ssh 獲取相關參數的順序如下:

1.command-line options
2.user's configuration file (~/.ssh/config)
3.system-wide configuration file (/etc/ssh/ssh_config)

ssh 利用非對稱加密實現安全的登錄,非對稱加密中有兩個密鑰:公鑰和私鑰。公鑰由私鑰產生,但卻無法推算出私鑰;公鑰加密後的密文,只能通過對應的私鑰來解密。非對稱加密的登錄流程如下:

整個登錄過程如下:

1.topgun 終端要登錄 Server 服務器,發起登錄請求 `ssh work@server.com`。
2.服務端運行有 sshd 服務,並監聽指定的端口,默認爲 22 號端口。服務端會生成一對公鑰和私鑰;此時將公鑰返回給客戶端;
3.客戶端使用公鑰,對登錄密碼進行加密(如服務器work用戶密碼爲xxx),生成公鑰加密字符串;
4.客戶端將公鑰加密字符串發送給服務端;
5.服務端使用私鑰,解密公鑰加密字符串,得到原始密碼;
6.校驗密碼是否合法(此爲本機 work 密碼);
7.返回登錄結果給客戶端:成功登錄或密碼錯。

在非對稱加密中,由於只有公鑰會被傳輸,而私鑰是服務端本地保存,因此即便公鑰被監聽,也無法拿到原始密碼,從而安全地登錄服務器。

(2)在遠程主機上執行指定命令,如查看遠程主機指定設備的分區情況。

ssh -p3600 root@9.134.114.170 fdisk -l /dev/vda
root's password: 
Authentication successful.

Disk /dev/vda: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xf6abafec

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1              63   209712509   104856223+  83  Linux

(3)通過 ssh 實現免密登錄。免密登錄的實現過程如下:

1.在客戶端使用 ssh-keygen 生成一對密鑰:公鑰+私鑰;
2.將客戶端公鑰追加到服務端的 authorized_key 文件中,完成公鑰認證操作;
3.認證完成後,客戶端向服務端發起登錄請求,並傳遞公鑰到服務端;
4.服務端檢索 authorized_key 文件,確認該公鑰是否存在。如果存在該公鑰,則生成隨機數 R,並用公鑰進行加密,生成公鑰加密字符串 pubKey(R);
5.將公鑰加密字符串傳遞給客戶端;
6客戶端使用私鑰解密公鑰加密字符串,得到 R;
7.服務端和客戶端通信時會產生一個會話 ID(sessionKey),用 MD5 對 R 和 SessionKey 進行加密,生成摘要;
8.客戶端將生成的 MD5 加密字符串傳給服務端;
9.服務端同樣生成 MD5(R,SessionKey) 加密字符串;
10.如果客戶端傳來的加密字符串等於服務端自身生成的加密字符串,則認證成功。此時不用輸入密碼,即完成建連,可以開始遠程執行 Shell 命令了。

第一步使用 ssh-keygen 命令在客戶端生成 RSA 公鑰和私鑰,一直回車確認。公鑰和私鑰默認名稱爲 id_rsa.pub(公鑰)和私鑰(id_rsa),默認保存在 ~/.ssh 目錄下。

ssh-keygen -t rsa

第二步將客戶端公鑰追加至服務端 ~/.ssh/authorized_keys 文件中,authorized_keys 是用來存放客戶端公鑰的文件。有三種方法,一是通過 ssh-copy-id 命令,二是通過 scp 命令,三是手動複製。例如使用 ssh-copy-id 命令實現如下:

ssh-copy-id -i ~/.ssh/id_rsa.pub -p 3600 root@9.134.114.170

第三步使用 ssh 進行免密登錄。

ssh -p3600 root@9.134.114.170

轉自:戀貓大鯉魚 

dablelv.blog.csdn.net/article/details/104616612

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/-j9si4qRFMPAHzP8o09-OQ