SSH 教程-2 密鑰登錄 證書登錄 端口轉發 [MD]


博文地址

我的GitHub 我的博客 我的微信 我的郵箱
baiqiantao baiqiantao bqt20094 baiqiantao@sina.com

目錄

SSH 教程 -2

本文改編自 網道的 SSH 教程,主要為了精簡大量本人不感興趣的內容。

本教程約定,大寫的 SSH 表示協議,小寫的 ssh 表示客戶端軟件。

SSH 密鑰登錄

SSH 默認采用密碼登錄,密鑰登錄是比密碼登錄更好的方案。

密鑰(key)是一個非常大的數字,通過加密算法得到。對稱加密只需要一個密鑰,非對稱加密需要兩個密鑰成對使用,分為公鑰(public key)和私鑰(private key)。

SSH 密鑰登錄采用的是非對稱加密,每個用戶通過自己的密鑰登錄。其中,私鑰必須私密保存,不能泄漏;公鑰則是公開的,可以對外發送。公鑰和私鑰是一一對應的,每一個私鑰都有且僅有一個對應的公鑰,反之亦然。

如果數據使用公鑰加密,那么只有使用對應的私鑰才能解密;同樣,如果使用私鑰加密(這個過程一般稱為簽名),也只有使用對應的公鑰才能解密。

密鑰登錄的過程

SSH 密鑰登錄分為以下的步驟。

  • 第一步,手動將客戶端的公鑰放入遠程服務器的指定位置
  • 第二步,客戶端向服務器發起 SSH 登錄的請求
  • 第三步,服務器收到用戶 SSH 登錄的請求,發送一些隨機數據給用戶,要求用戶證明自己的身份
  • 第四步,客戶端收到服務器發來的數據,使用客戶端的私鑰對隨機數據進行加密 -- 即簽名,然后再發給服務器
  • 第五步,服務器收到客戶端發來的加密簽名后,使用客戶端的公鑰解密,然后跟原始數據比較,如果一致,就允許用戶登錄

使用 ssh-keygen 生成密鑰

OpenSSH 提供的ssh-keygen命令,可以用來生成密鑰。

cd ~/.ssh            # 定位到 C:\Users\白乾濤\.ssh 目錄,沒有時可以手動創建
ssh-keygen           # 生成密鑰,不指定加密算法時默認使用 RSA 算法
ssh-keygen -t dsa    # 指定密鑰的加密算法,一般選擇 DSA 算法或 RSA 算法
ssh-keygen -C xx@yy  # 指定注釋,不指定時默認使用當前的用戶名和主機名作為注釋

使用案例

ssh-keygen -t rsa -C baiqiantao@sina.com

# 會讓你確認文件名和密碼(passphrase),一般不需要輸入,連輸三個回車就行
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/白乾濤/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

# 提示生成的密鑰保存的位置
Your identification has been saved in /c/Users/白乾濤/.ssh/id_rsa
Your public key has been saved in /c/Users/白乾濤/.ssh/id_rsa.pub

# 打印公鑰的指紋、注釋等信息
The key fingerprint is:
SHA256:0OhBsziHgIT6kY8gZzleNJ4gZc1C8IjCTOjs+ajDE7k baiqiantao@sina.com

公鑰文件的內容類似下面這樣。

ssh-rsa AAAAB3NzaC1yc......Bw49gnT80U= baiqiantao@sina.com
# 注意,公鑰只有一行。末尾的 baiqiantao@sina.com 是公鑰的注釋,不是必需項。

命令的配置項

  • -b:bits,指定密鑰的二進制位數
  • -C:comment,為密鑰文件指定新的注釋,格式為username@host
  • -f:file,指定生成的私鑰文件
  • -t:指定生成密鑰的加密算法,dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa
  • -N:new,在創建時指定私鑰的密碼
  • -p:passphrase,在創建后重新指定私鑰的密碼
  • -F:find,檢查某個主機名是否在known_hosts文件里面
  • -R:remove,將指定的主機公鑰指紋移出known_hosts文件
ssh-keygen [-q] [-a rounds] [-b bits] [-C comment] [-f output_keyfile] [-m format] [-N new_passphrase] [-O option] [-t rsa] [-w provider]
ssh-keygen -p [-a rounds] [-f keyfile] [-m format] [-N new_passphrase] [-P old_passphrase]
ssh-keygen -i [-f input_keyfile] [-m key_format]
ssh-keygen -e [-f input_keyfile] [-m key_format]
ssh-keygen -y [-f input_keyfile]
ssh-keygen -c [-a rounds] [-C comment] [-f keyfile] [-P passphrase]
ssh-keygen -l [-v] [-E fingerprint_hash] [-f input_keyfile]
ssh-keygen -B [-f input_keyfile]
ssh-keygen -D pkcs11
ssh-keygen -F hostname [-lv] [-f known_hosts_file]
ssh-keygen -H [-f known_hosts_file]
ssh-keygen -K [-a rounds] [-w provider]
ssh-keygen -R hostname [-f known_hosts_file]
ssh-keygen -r hostname [-g] [-f input_keyfile]
ssh-keygen -M generate [-O option] output_file
ssh-keygen -M screen [-f input_file] [-O option] output_file
ssh-keygen -I certificate_identity -s ca_key [-hU] [-D pkcs11_provider][-n principals] [-O option] [-V validity_interval] [-z serial_number] file ...
ssh-keygen -L [-f input_keyfile]
ssh-keygen -A [-a rounds] [-f prefix_path]
ssh-keygen -k -f krl_file [-u] [-s ca_public] [-z version_number] file ...
ssh-keygen -Q [-l] -f krl_file [file ...]
ssh-keygen -Y find-principals -s signature_file -f allowed_signers_file
ssh-keygen -Y check-novalidate -n namespace -s signature_file
ssh-keygen -Y sign -f key_file -n namespace file ...
ssh-keygen -Y verify -f allowed_signers_file -I signer_identity -n namespace -s signature_file [-r revocation_file]

上傳公鑰

生成密鑰以后,公鑰必須上傳到服務器,才能使用公鑰登錄。

手動上傳公鑰到服務器

OpenSSH 規定,用戶的公鑰需要添加到服務器上該用戶主目錄的~/.ssh/authorized_keys文件中,每個公鑰占一行。用戶可以手動創建、編輯該文件。

cat  ~/.ssh/authorized_keys    # 查看
touch ~/.ssh/authorized_keys   # 創建
vim ~/.ssh/authorized_keys     # 編輯

公鑰上傳到服務器后,下次登錄時,OpenSSH 就會自動采用密鑰登錄,不再提示輸入密碼。

使用 ssh-copy-id 上傳公鑰

通過 OpenSSH 提供的ssh-copy-id命令,可以自動將公鑰拷貝到遠程服務器的~/.ssh/authorized_keys文件。如果文件不存在,會自動創建該文件。

用戶在本地計算機執行下面的命令,就可以把本地的公鑰拷貝到服務器

ssh-copy-id -i xx user@host
# 把公鑰 xx 拷貝到服務器 host 下 user 用戶的 ~/.ssh/authorized_keys 中
# 參數 -i 用來指定公鑰文件,公鑰文件可以不指定路徑和后綴名,會自動在 ~/.ssh 目錄里面尋找
# user 是所要登錄的賬戶名,省略時默認使用當前的本機用戶名;host 是服務器地址

執行 ssh-copy-id 命令時,會采用密碼登錄,系統會提示輸入遠程服務器的密碼

注意,ssh-copy-id命令是直接將公鑰添加到authorized_keys文件的末尾,所以請務必保證authorized_keys文件的末尾是一個換行符,否則會導致兩個公鑰連在一起,使得它們都無法生效。

手動配置公鑰到 GitHub

  • 復制文件id_rsa.pub里面的內容
  • 依次進入Github -> Settings -> SSH and GPG keys -> New SSH key
  • Title處填入任意的標識,在Key部分里面添加剛才復制的id_rsa.pub文件里的內容,點擊添加即可
ssh -T git@github.com   # 驗證是否添加成功
Hi baiqiantao! You've successfully authenticated, but GitHub does not provide shell access.

實戰:通過 SSH 登錄 WSL

我的 wsl 登錄密碼為:123

環境准備

wsl       # 啟動后顯示的 bqt@BQT-X 代表 user@host,$ 代表普通用戶,# 代表 root 用戶
uname -a  # 顯示電腦以及操作系統的相關信息【Linux BQT-X 4.19.128... GNU/Linux】
cd ~      # 進入用戶主目錄【/home/bqt】,其他命令【echo ~】【whoami】【pwd】【ll】
ifconfig  # 查看服務端的 ip,此 ip 即服務器的 host,例如【inet 172.26.238.88】
ssh -V    # 顯示 ssh 版本【OpenSSH_8.2p1...】,沒安裝時會提示你安裝

sudo apt install openssh-client      # 在 Ubuntu 和 Debian 上安裝 ssh 客戶端
sudo apt install openssh-server      # 在 Ubuntu 和 Debian 上安裝 ssh 服務端
sudo service ssh restart/start/stop  # 重啟/啟動/停止 sshd 服務
ps -e |grep ssh                      # 服務啟動的話會看到 sshd

服務端配置

# 啟動服務時如果提示 sshd: no hostkeys available,說明還沒為服務器 host 生成密鑰
sudo chmod 777 /etc/ssh/                        # 修改權限,否則生成的密鑰無法保存
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key  # 生成服務器的 rsa 密鑰,注意存放位置
ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key  # 生成服務器的 dsa 密鑰,注意存放位置

# 即使將客戶端的公鑰上傳到了服務器,服務端 sshd 配置文件中的一些配置項,也可能會導致密鑰登錄失敗
cat /etc/ssh/sshd_config             # 查看服務端 sshd 的配置,可使用【|grep】過濾
sudo chmod 777 /etc/ssh/sshd_config  # 修改權限
vim /etc/ssh/sshd_config             # 修改配置

cat /etc/ssh/sshd_config |grep PasswordAuthentication  # 修改為 no,啟用密碼登錄
cat /etc/ssh/sshd_config |grep StrictModes             # 修改為 no,禁用嚴格模式
sudo service ssh restart                               # 必須重啟 sshd 才能生效

上傳公鑰

ssh bqt@172.26.238.88                    # 未上傳公鑰前會要求輸入密碼
ssh-copy-id -i id_rsa bqt@172.26.238.88  # 上傳公鑰,上傳后不需要密碼就可以直接登錄

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
bqt@172.26.238.88 ’s password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh bqt@172.26.238.88"
and check to make sure that only the key(s) you wanted were added.

注意,有些版本的 ssh-copy-id 命令會導致上傳失敗,詳見 ssh-copy-id fails due to shell incompatibility

SSH 證書登錄

SSH 是服務器登錄工具,一般情況下都采用密碼登錄密鑰登錄,這兩種方式都有各自的缺點。

  • 密碼登錄需要輸入服務器密碼,這非常麻煩,也不安全,存在被暴力破解的風險。
  • 密鑰登錄需要服務器保存用戶的公鑰,也需要用戶保存服務器公鑰的指紋。這對於多用戶、多服務器的大型機構很不方便,例如如果有員工離職,需要將他的公鑰從每台服務器刪除。

什么是證書登錄

證書登錄就是為了解決上面的缺點而設計的。它引入了一個證書頒發機構(Certificate Authority,簡稱 CA),對信任的服務器頒發服務器證書,對信任的用戶頒發用戶證書

登錄時,用戶和服務器不需要提前知道彼此的公鑰,只需要交換各自的證書,驗證是否可信即可。

證書登錄的主要優點有兩個:

  • 用戶和服務器不用交換公鑰,這更容易管理,也具有更好的可擴展性
  • 證書可以設置到期時間,而公鑰沒有到期時間,可以進一步提高安全性

證書登錄的流程

SSH 證書登錄之前,如果還沒有證書,需要生成證書。具體方法是:

  • 用戶將自己的公鑰發給 CA,CA 使用用戶的公鑰,生成用戶證書,發給用戶
  • 服務器將自己的公鑰發給 CA,CA 使用服務器公鑰,生成服務器證書,發給服務器

有了證書以后,用戶就可以登錄服務器了。整個過程都是 SSH 自動處理,用戶無感知。

  • 第一步,用戶登錄服務器時,SSH 自動將用戶證書發給服務器
  • 第二步,服務器檢查用戶證書是否有效,以及是否由可信的 CA 頒發。證實以后,服務器就可以信任用戶
  • 第三步,SSH 自動將服務器證書發給用戶
  • 第四步,用戶檢查服務器證書是否有效,以及是否由信任的 CA 頒發。證實以后,用戶就可以信任服務器
  • 第五步,雙方建立連接,用戶成功登錄服務器

使用 CA 簽發證書

生成 CA 密鑰

證書登錄的前提是,必須有一個 CA,而 CA 本質上就是一對密鑰,跟其他密鑰沒有不同,CA 就用這對密鑰去簽發證書。

雖然 CA 可以用同一對密鑰簽發用戶證書和服務器證書,但是出於安全性和靈活性,CA 一般需要兩對密鑰,一對用來簽發用戶證書,另一對用來簽發服務器證書。

ssh-keygen -t rsa -f ~/.ssh/user_ca -C user_ca  # 生成 CA 簽發用戶證書的密鑰
ssh-keygen -t rsa -f ~/.ssh/host_ca -C host_ca  # 生成 CA 簽發服務器證書的密鑰

簽發服務器證書

CA 簽發服務器證書時,需要 CA 的密鑰以及服務器的公鑰

一般來說,SSH 服務器安裝時,已經生成密鑰/etc/ssh/ssh_host_rsa_key了,如果沒有的話,可用下面的命令生成。

sudo chmod 777 /etc/ssh/                        # 可能需要修改權限,否則生成的密鑰無法保存
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key  # 生成服務器的 rsa 密鑰,注意存放位置
ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key  # 生成服務器的 dsa 密鑰,注意存放位置

將服務器公鑰ssh_host_rsa_key.pub上傳到 CA 服務器后,就可以使用 CA 的密鑰host_ca為服務器的公鑰ssh_host_rsa_key.pub簽發服務器證書。

ssh-keygen -s host_ca -I xxx -h -n yyy -V +52w ssh_host_rsa_key.pub  # 生成服務器證書
ssh-keygen -L -f ssh_host_rsa_key-cert.pub                           # 查看證書信息
  • -s:signature,指定 CA 簽發服務器證書的密鑰
  • -I:identity,身份字符串,可以隨便設置,用於方便區分證書,將來可以使用這個字符串撤銷證書
  • -h:host,指定該證書是服務器證書,而不是用戶證書
  • -n:name,指定服務器的域名,表示證書僅對該域名有效
    • 如果有多個域名,則使用逗號分隔
    • 用戶登錄該域名服務器時,SSH 通過這個值,分辨應該使用哪張證書發給用戶,用來證明服務器的可信性
  • -V:validity,指定證書的有效期,+52w表示為52周(即一年),+1d表示為1天。證書默認永遠有效
  • ssh_host_rsa_key.pub:服務器的公鑰
ssh-keygen -s host_ca -I host_ca_bqt -h -n 172.26.238.88 -V +52w ssh_host_rsa_key.pub

Signed host key ssh_host_rsa_key-cert.pub: id "host_ca_bqt" serial 0 for 172.26.238.88
valid from 2021-12-12T00:38:00 to 2022-12-11T00:39:18

簽發用戶證書

和簽發服務器證書類似,將用戶公鑰user_key.pub上傳到 CA 服務器后,就可以使用 CA 的密鑰user_ca為用戶的公鑰user_key.pub簽發用戶證書。

ssh-keygen -s user_ca -I user_ca_bqt -n bqt -V +52w user_key.pub # 和簽發服務器證書相比,少了一個【-h】

Signed user key user_key-cert.pub: id "user_ca_bqt" serial 0 for bqt
valid from 2021-12-12T00:45:00 to 2022-12-11T00:46:01
  • -n:name,指定用戶名,表示證書僅對該用戶名有效
    • 如果有多個用戶名,使用逗號分隔
    • 用戶以該用戶名登錄服務器時,SSH 通過這個值,分辨應該使用哪張證書,證明自己的身份,發給服務器
  • user_key.pub:用戶的公鑰

安裝證書

服務器安裝證書

scp ssh_host_rsa_key-cert.pub bqt@172.26.238.88:/etc/ssh/  # 將生成的服務器證書,拷貝到服務器

然后,修改服務器配置文件/etc/ssh/sshd_config,設置服務器使用的證書為ssh_host_rsa_key-cert.pub

cat /etc/ssh/sshd_config |grep HostCertificate       # 查看服務器當前使用的證書
HostCertificate /etc/ssh/ssh_host_rsa_key-cert.pub   # 修改服務器使用的證書
sudo service ssh restart                             # 必須重啟 sshd 才能生效

服務器安裝 CA 公鑰

為了讓服務器信任用戶證書,必須將 CA 簽發用戶證書的公鑰 拷貝到服務器的/etc/ssh目錄。

scp user_ca.pub bqt@172.26.238.88:/etc/ssh/  # 將簽發用戶證書的公鑰,拷貝到服務器

然后,修改服務器配置文件/etc/ssh/sshd_config,設置服務器信任此簽發用戶證書的公鑰user_ca.pub。設置后,所有登錄服務器的賬戶,都會信任user_ca.pub簽發的用戶證書。

cat /etc/ssh/sshd_config |grep TrustedUserCAKeys  # 查看服務器當前信任的,簽發用戶證書的公鑰
TrustedUserCAKeys /etc/ssh/user_ca.pub            # 設置服務器信任 user_ca 簽發的用戶證書
sudo service ssh restart                          # 必須重啟 sshd 才能生效

另一種做法

另一種做法是將user_ca.pub加到服務器某個賬戶~/.ssh/authorized_keys文件,只讓該賬戶信任user_ca簽發的用戶證書。具體方法是打開~/.ssh/authorized_keys,追加一行,開頭是@cert-authority principals="...",然后后面加上user_ca.pub的內容,大概是下面這個樣子。

@cert-authority principals="user" ssh-rsa AAAAB3Nz...XNRM1EX2gQ==
# 代碼中 "user" 指的是用戶登錄的服務器賬戶名,一般就是 authorized_keys 文件所在的賬戶

客戶端安裝證書

客戶端安裝用戶證書很簡單,就是將 CA 生成的用戶證書user_key-cert.pub復制到客戶端,與用戶的密鑰user_key保存在同一個目錄即可。

客戶端安裝 CA 公鑰

為了讓客戶端信任服務器證書,必須將 CA 簽發服務器證書的公鑰 拷貝到客戶端。

  • 用戶級別配置文件:~/.ssh/known_hosts
  • 全局級別配置文件:/etc/ssh/ssh_known_hosts

具體做法是,打開配置文件,追加一行,開頭為@cert-authority *.example.com,然后將簽發服務器證書的公鑰host_ca.pub的內容粘貼在后面。

@cert-authority 172.26.238.88 ssh-rsa AAAAB3NzaC1yc......DCKhor3AOb0= host_ca

上面的*.example.com是域名的模式匹配,表示只要服務器符合該模式的域名,且簽發服務器證書的 CA 匹配后面給出的公鑰,就都可以信任

  • 如果沒有域名限制,這里可以寫成*
  • 如果有多個域名模式,可以使用逗號分隔
  • 如果服務器沒有域名,可以用主機名或者 IP 地址

使用證書登錄遠程服務器

ssh bqt@172.26.238.88             # 使用默認的密鑰 id_rsa 與證書 id_rsa-cert.pub 登錄服務器
ssh -i user_key bqt@172.26.238.88 # 使用指定的密鑰 user_key 與證書 user_key-cert.pub 登錄服務器

廢除證書

廢除證書的操作,分成用戶證書的廢除和服務器證書的廢除兩種。

服務器證書的廢除,只需用戶在客戶端known_hosts文件里面,刪除對應的@cert-authority命令的那一行即可。

用戶證書的廢除,需要

  • 在服務器通過命令新建一個/etc/ssh/revoked_keys文件,文件中保存的是不再信任的用戶公鑰
  • 在服務器配置文件sshd_config中,將配置項RevokedKeys的值設置為此文件
ssh-keygen -k -f /etc/ssh/revoked_keys -z 1 ~/.ssh/user1_key.pub    # 將不再信任的用戶公鑰保存在第1行
ssh-keygen -k -f -u /etc/ssh/revoked_keys -z 2 ~/.ssh/user2_key.pub # 將不再信任的用戶公鑰保存在第2行
RevokedKeys /etc/ssh/revoked_keys                                   # 讓服務器知曉不再信任的用戶公鑰

SSH 端口轉發

SSH 除了登錄服務器,還有一大用途,就是作為加密通信的中介,充當兩台服務器之間的通信加密跳板,使得原本不加密的通信變成加密通信。這個功能稱為端口轉發(port forwarding),又稱 SSH 隧道(tunnel)。

端口轉發有兩個主要作用:

  • 將不加密的數據放在 SSH 安全連接里面傳輸,使得原本不安全的網絡服務增加了安全性,比如通過端口轉發訪問 Telnet、FTP 等明文服務,數據傳輸就都會加密
  • 作為數據通信的加密跳板,繞過網絡防火牆

端口轉發有三種使用方法:動態轉發本地轉發遠程轉發

這一塊的內容非常重要,這里就先不寫了,后面會專門學習總結。

其他相關命令

安全拷貝命令:scp

scp是 SSH 提供的一個客戶端程序,用來在兩台主機之間加密傳送文件。使用scp傳輸數據時,文件和密碼都是加密的,不會泄漏敏感信息。

scp是 secure copy 的縮寫,它的底層是 SSH 協議,默認端口是22,相當於先使用ssh命令登錄遠程主機,然后在加密連接之中復制文件。客戶端發起連接后,會提示用戶輸入密碼。如果是在兩個遠程系統之間復制,系統將提示你輸入兩個遠程帳戶的密碼。

使用案例

scp fromFile user@host:toFile    # 將本機當前目錄的 fromFile 復制到遠程主機用戶主目錄下的 toFile
scp user@host:fromFile toFile    # 如果目標位置已存在同名文件,則會在不提示的情況下直接覆蓋
scp from1 from2 user@host:toDir  # 支持一次復制多個文件
scp user_ca.pub bqt@172.26.238.88:/etc/ssh/  # 將簽發用戶證書的公鑰,拷貝到服務器

# 用戶名的默認值是本機的當前用戶名,主機名默認為當前主機,也可以使用配置文件中定義的主機別名
scp sourceFile remote_username@server_ip:/remoteTargetFile   # 復制本地文件到遠程主機
scp -r sourceDir remote_username@server_ip:/remoteTargetDir  # 復制本地整個目錄到遠程主機
scp remote_username@server_ip:/remoteSourceFile targetFile   # 復制遠程主機文件到本地
scp -r remote_username@server_ip:/remoteSourceDir targetDir  # 復制遠程主機整個目錄到本地
scp userA@hostA:dir/SourceFile userB@hostB:dire/SourceFile   # 從遠程主機 A 拷貝到遠程主機 B

配置項

  • -c:使用指定的加密算法
  • -F:使用指定的配置文件,默認為.ssh/config,連接時可以使用配置文件中定義的主機別名等配置
  • -i:使用指定的密鑰
  • -P:指定遠程主機的 SSH 端口,默認端口為 22
  • -l:限制傳輸數據的帶寬速率,單位是 Kbit/sec
  • -C:無參數,在傳輸時壓縮文件
  • -p:無參數,保留 modification time、access time、mode 等原始文件的信息
  • -q:無參數,關閉顯示拷貝的進度條
  • -r:無參數,以遞歸方式復制目錄
  • -v:無參數,顯示詳細的輸出

文件同步命令:rsync

rsync 是 Linux 中用於文件同步的應用程序,它可以在本地計算機與遠程計算機之間,或者兩個本地目錄之間同步文件。它也可以當作文件復制工具,替代cpmv命令。

名稱里面的r指的是 remote,rsync 其實就是 remote sync 的意思。與文件傳輸工具 FTP 或 scp 相比,rsync 最大的特點是,會檢查發送方和接收方已有的文件,僅傳輸有變動的部分(默認規則是文件大小或修改時間有變動)。

rsync 並不是 SSH 工具集的一部分。

sudo apt-get install rsync   # 傳輸的雙方都必須安裝 rsync
rsync -r source destination  # 將源目錄拷貝到目標目錄,參數 -r 表示遞歸,即包含子目錄
rsync -r s1 s2 destination   # 可以同時拷貝多個文件或目錄。目標目錄如果不存在,會自動創建
rsync -a source destination  # 參數 -a 表示除了遞歸同步以外,還同步元信息,比如修改時間、權限等
rsync -a source/ destination # 以斜杠結尾表示只同步內容,而不會在 destination 下面創建 source 子目錄
rsync -anv source/ dest      # -n 表示是模擬命令執行的結果,而並不真的執行命令;-v 是將結果輸出到終端
rsync -av --delete sou/ dest # --delete 表示將目標目錄成為源目錄的一個鏡像,會刪除源目錄中不存在的文件

安全文件傳輸命令: sftp

sftp是 SSH 提供的一個客戶端應用程序,主要用來安全地訪問 FTP。sftp就相當於將 FTP(File Transfer Protocol) 放入了 SSH。

sftp username@hostname     # 連接 FTP 主機,連接時會要求輸入 FTP 的密碼
# 密碼驗證成功以后,就會出現 FTP 的提示符【sftp>】,下面就可以輸入各種 FTP 命令了
  • ls [directory]:列出遠程目錄的內容
  • cd directory:改到指定的遠程目錄
  • mkdir directory:創建一個遠程目錄
  • rmdir path:刪除一個遠程目錄
  • put localfile [remotefile]:將本地文件推送(put)到遠程主機
  • get remotefile [localfile]:將遠程主機文件拉取(get)到本地
  • help:顯示幫助信息
  • byequitexit:退出 sftp

2021-12-12


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM