關聯文章
- Linux ssh 免密登錄配置👍
- 對日開發 TeraTerm 批量向各臺服務器傳輸文件
- SSH 教程👍👍👍👍👍👍
目錄
- 一. ssh-keygen相關命令
- 1.1 簡介
- 1.2 生成密鑰
- 1.3 ssh-copy-id 上傳公鑰到指定的服務器
- 1.4 服務器的公鑰指紋查看
- 1.4.1 ssh-keyscan 在客戶端查看對方服務器的公鑰指紋
- 1.4.2 在服務器端查看公鑰指紋
- 1.5 `-F` 查看指定服務器對應的完整公鑰
- 1.6 `-R` 刪除指定服務器對應的公鑰
- 二. ssh命令
- 2.1 `-v` 查看連接的詳細信息
- 2.2 `-p` 指定端口號
- 2.3 連接遠程服務器的時候執行命令
- 2.3.1 連接單臺服務器時,執行命令
- 2.3.2 批量連接多臺服務器時執行命令
一. ssh-keygen相關命令
1.1 簡介
?ssh-keygen
是一個用于 創建 SSH 密鑰對(公鑰和私鑰) 的命令行工具,主要用于 SSH 認證。這些密鑰可以用來:
- 無密碼地登錄遠程服務器(通過公鑰認證)
- 對數據進行加密與簽名(如 Git 簽名等)
- 管理
known_hosts
文件中主機的指紋
? SSH 密鑰對的原理簡述
- 在本地生成密鑰對(私鑰保存在本地,公鑰可以公開)。
- 把公鑰上傳到服務器的 ~/.ssh/authorized_keys。
- 登錄服務器時,SSH 客戶端用私鑰進行身份認證,服務器用你上傳的公鑰進行驗證。
這樣就能實現:免密碼、安全登錄遠程主機。
1.2 生成密鑰
-t ed25519
:指定加密算法-C "fengyehong123@example.com"
:- 公鑰中會默認使用當前系統的用戶名和主機名作為注釋
- 指定給密鑰添加注釋(通常是郵箱或用戶名,方便識別密鑰用途)
-f ~/.ssh/key
:指定密鑰輸出的位置,會生成以下2個文件- ?? 私鑰:
~/.ssh/key
- ?? 公鑰:
~/.ssh/key.pub
- ?? 私鑰:
ssh-keygen -t ed25519 -C "fengyehong123@example.com" -f ~/.ssh/key
1.3 ssh-copy-id 上傳公鑰到指定的服務器
- 命令執行之后,會把公鑰的內容給追加到對方服務器的
~/.ssh/authorized_keys
文件中
ssh-copy-id -i ~/.ssh/key.pub apluser@172.22.118.28
1.4 服務器的公鑰指紋查看
1.4.1 ssh-keyscan 在客戶端查看對方服務器的公鑰指紋
- 💥注意:這種方式不能 100% 保證安全(容易被中間人攻擊),除非所在的網絡環境受到信任
$ ssh-keyscan 172.22.118.28 2>/dev/null | ssh-keygen -lf -
256 SHA256:R6Ra3HpmUF8+MgTj2Rd7guogV2STz1mjLhfIGA7fJB8 172.22.118.28 (ED25519)
3072 SHA256:6zpOXvNpQQZUMevJe+/bSGcySCnqBGZE8p2hoMjPNh0 172.22.118.28 (RSA)
256 SHA256:ZMFgHvPdsZSIuGyEkv1WFgJT3eGjSC4AI/HwTMH4s8o 172.22.118.28 (ECDSA)
- 指定查看某種加密方式所對應的密鑰
$ ssh-keyscan -t ed25519 172.22.118.28 2>/dev/null | ssh-keygen -lf -
256 SHA256:R6Ra3HpmUF8+MgTj2Rd7guogV2STz1mjLhfIGA7fJB8 172.22.118.28 (ED25519)
1.4.2 在服務器端查看公鑰指紋
- 服務器的公鑰都保存在
/etc/ssh/
目錄下
apluser@FengYeHong-HP:~$ ls -l /etc/ssh/*.pub
-rw-r--r-- 1 root root 180 May 25 21:45 /etc/ssh/ssh_host_ecdsa_key.pub
-rw-r--r-- 1 root root 100 May 25 21:45 /etc/ssh/ssh_host_ed25519_key.pub
-rw-r--r-- 1 root root 572 May 25 21:45 /etc/ssh/ssh_host_rsa_key.pub
apluser@FengYeHong-HP:~$
apluser@FengYeHong-HP:~$ ssh-keygen -lf /etc/ssh/ssh_host_ecdsa_key.pub
256 SHA256:ZMFgHvPdsZSIuGyEkv1WFgJT3eGjSC4AI/HwTMH4s8o root@FengYeHong-HP (ECDSA)
apluser@FengYeHong-HP:~$
apluser@FengYeHong-HP:~$ ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
256 SHA256:R6Ra3HpmUF8+MgTj2Rd7guogV2STz1mjLhfIGA7fJB8 root@FengYeHong-HP (ED25519)
apluser@FengYeHong-HP:~$
apluser@FengYeHong-HP:~$ ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub
3072 SHA256:6zpOXvNpQQZUMevJe+/bSGcySCnqBGZE8p2hoMjPNh0 root@FengYeHong-HP (RSA)
1.5 -F
查看指定服務器對應的完整公鑰
命令 | 顯示內容 | 含義 |
---|---|---|
ssh-keygen -F <IP> | 顯示的是完整公鑰(Base64) | known_hosts 中保存的原始公鑰 |
ssh-keygen -lf ~/.ssh/known_hosts | 顯示的是指紋(SHA256 hash) | 便于人工比對、防止被偽造 |
- 當連接服務器成功之后,服務器的公鑰會被保存到
- Linux環境:
~/.ssh/known_hosts
- Windows環境:
$HOME/.ssh/known_hosts
- Linux環境:
- 可以通過
-F
配置項查詢指定服務器對應的公鑰
$ ssh-keygen -F 172.22.118.28 | grep -v '#'
172.22.118.28 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICw5prT13UbYsJw4qzWDpq34WjbVpuT5xqNvb5hXMH8w
172.22.118.28 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCl/8jZjH5edrPIgtmGBg8NjfBk2b1aRqW66LZeD0vdiMEB8TYagccKYAg4h9RFyq2s/zjUh5EIK7gaYNapbLv/3ZtbwJf0UWieskK2x+dVbBySfKQjSobjCGrkf1ieLgv5ZIYmPxyT2lcTPOJLT3qQTVGr4Boygx2Ai3pOOqjs8jzVQaAPVnEGaHpqU4XyQxY2mvehe3lvvXd799vF3c5E+hKGJA2mGViYFSeZKhRXeoy/oTvEBYsAlYsT8efgyDE5F5ZqKXekxTy9bZbwutD4PDC6pt89h52oVoZJsuC28RsNmds/f0s8wJrsvantStZa9J1MiOTIgA4DsvvbwuSwMJLqis5pAFMV2IZ+efdrQPWeA2WKcBacCIjjfB4p5O3/HoXJFJfbWNJTnTbsCnyzlOZ42GZTB6JB192/LlPxsBDmeUrSZlPUjhGTxA8BEkzgL6a4HCzw0jKNGkR1L/UT4D/qcNWWZHhBvZaCWinYLUjXQpMNRKA51WM+GXChw+8=
172.22.118.28 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBJu6r6tihFTYzSsXHk+fFp3Xnq7jNRJCrJbhdC8gpSJpoujxfv1JMVoYUiZNSI2ucR8oJFIgTul50ez31kXwX9c=
- 💥注意:
-F
查看的是服務器的完整公鑰(Base64編碼后),并不是公鑰的指紋 - 可以通過下面的命令將Base64編碼后完整公鑰轉換為公鑰指紋,方便比對
# 服務器端查看公鑰指紋
apluser@FengYeHong-HP:~$ ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
256 SHA256:R6Ra3HpmUF8+MgTj2Rd7guogV2STz1mjLhfIGA7fJB8 root@FengYeHong-HP (ED25519)# 在客戶端將Base64編碼后完整公鑰轉換為公鑰指紋
$ echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICw5prT13UbYsJw4qzWDpq34WjbVpuT5xqNvb5hXMH8w" | ssh-keygen -lf -
256 SHA256:R6Ra3HpmUF8+MgTj2Rd7guogV2STz1mjLhfIGA7fJB8 no comment (ED25519)
- 可以通過下面的命令批量查看服務器保存到客戶端的全部公鑰的指紋
$ ssh-keygen -F 172.22.118.28 | grep -v '#' | awk '{print $2 " " $3}' | ssh-keygen -lf -
256 SHA256:R6Ra3HpmUF8+MgTj2Rd7guogV2STz1mjLhfIGA7fJB8 no comment (ED25519)
3072 SHA256:6zpOXvNpQQZUMevJe+/bSGcySCnqBGZE8p2hoMjPNh0 no comment (RSA)
256 SHA256:ZMFgHvPdsZSIuGyEkv1WFgJT3eGjSC4AI/HwTMH4s8o no comment (ECDSA)
- 💥需要:如果服務器使用的不是默認端口的話,需要指定端口才能查看
$ ssh-keygen -F [192.168.3.23]:2222
# Host [192.168.3.23]:2222 found: line 5
[192.168.3.23]:2222 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDmXkFXdtiy/3q/+C0n4oZWjk9Ooaue+qH5Ps4BIHdlVgyu3jaTJ8NMmaYebgjkzYca+GvHM4ymZB5pt/iR9DDcjpwA66nVjra8SWLZqxsnlbcs8RMR2fp8dVPvnG2uKnn3S0CHV/7/XbFdvX0nzWxHdA/YqVlUR4TPKzhAmM62DBEvRdWpuok0r2xTsE8Q/xv+SKE08t3BzUde4iDV8rEoJQ130W96sZBnEadQtr//jPIDuJ4Vjfu/xzDgqLF463AGB51E6lu9Ix9TmC+nfHCENPRrBHh6VgxHVnNi5rv9NO4kRT1CNMIeVOVccP7NY+v6j2INiEX6vo08HHK0CoQp
1.6 -R
刪除指定服務器對應的公鑰
?當遠程服務器被重新安裝、密鑰被更新或 IP 被他人占用時,就會出現類似于下面的警告
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:OYtwkILXy0dkzCTnO+2YclxZVOzQw9SzBHuaF3ve6Is.
Please contact your system administrator.
Add correct host key in /c/Users/Admin/.ssh/known_hosts to get rid of this message.
Offending RSA key in /c/Users/Admin/.ssh/known_hosts:2
Host key for [192.168.3.23]:2222 has changed and you have requested strict checking.
Host key verification failed.
Connection closed# 👇👇👇翻譯成中文就是👇👇👇
該主機的公鑰指紋跟 ~/.ssh/known_hosts 文件儲存的不一樣,必須處理以后才能連接。
這時,你需要確認是什么原因,使得公鑰指紋發生變更,到底是惡意劫持,還是管理員變更了 SSH 服務器公鑰。
# 👆👆👆翻譯成中文就是👆👆👆
?如果服務器是值得被信任的,可以通過-R
配置項刪除保存在known_hosts
文件中的服務器公鑰
當通過ssh命令再次連接服務器時,新的服務器公鑰指紋就會被重新添加到known_hosts
文件中。
# 刪除指定服務器對應的公鑰
$ ssh-keygen -R 172.22.118.28
# Host 172.22.118.28 found: line 6
# Host 172.22.118.28 found: line 7
# Host 172.22.118.28 found: line 8
~/.ssh/known_hosts updated.
Original contents retained as ~/.ssh/known_hosts.old# 再次連接時會出現提示
$ ssh apluser@172.22.118.28
The authenticity of host '172.22.118.28 (172.22.118.28)' can't be established.
ED25519 key fingerprint is SHA256:R6Ra3HpmUF8+MgTj2Rd7guogV2STz1mjLhfIGA7fJB8.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
二. ssh命令
2.1 -v
查看連接的詳細信息
2.2 -p
指定端口號
ssh -p 22 apluser@172.22.118.28
2.3 連接遠程服務器的時候執行命令
2.3.1 連接單臺服務器時,執行命令
# 要指定的命令可以不帶單引號
ssh apluser@172.22.118.28 ls -l ~/work/
# 但最好還是帶著單引號
ssh apluser@172.22.118.28 'ls -l ~/work/'
2.3.2 批量連接多臺服務器時執行命令
?執行后,只需要輸入服務器的密碼即可
for i in {1..2}; do ssh c1kap1${i}a 'ls -l /data/work'; done
?如果使用的TeamTerm連接linux服務器的話,還可以寫一個ttl腳本來批量執行
- 詳情請參考這篇博客 → 對日開發 TeraTerm 批量向各臺服務器傳輸文件
; -----------------------------------------
exec_cmd = "'ls -l /data/work/'"
SSH_PWD = 'pwd001'
; -----------------------------------------for i 1 2; 拼接ssh命令sprintf2 ssh_cmd 'ssh c1kap1%da %s' i exec_cmd; 執行ssh命令sendln ssh_cmdwait 'password:'sendln SSH_PWDwait '$'
next