Linux ssh-keygen系列命令與ssh命令的使用詳解
一. ssh-keygen相關(guān)命令
1.1 簡介
ssh-keygen 是一個(gè)用于 創(chuàng)建 SSH 密鑰對(duì)(公鑰和私鑰) 的命令行工具,主要用于 SSH 認(rèn)證。這些密鑰可以用來:
- 無密碼地登錄遠(yuǎn)程服務(wù)器(通過公鑰認(rèn)證)
- 對(duì)數(shù)據(jù)進(jìn)行加密與簽名(如 Git 簽名等)
- 管理
known_hosts文件中主機(jī)的指紋
SSH 密鑰對(duì)的原理簡述
- 在本地生成密鑰對(duì)(私鑰保存在本地,公鑰可以公開)。
- 把公鑰上傳到服務(wù)器的 ~/.ssh/authorized_keys。
- 登錄服務(wù)器時(shí),SSH 客戶端用私鑰進(jìn)行身份認(rèn)證,服務(wù)器用你上傳的公鑰進(jìn)行驗(yàn)證。
這樣就能實(shí)現(xiàn):免密碼、安全登錄遠(yuǎn)程主機(jī)。
1.2 生成密鑰
-t ed25519:指定加密算法-C "fengyehong123@example.com":- 公鑰中會(huì)默認(rèn)使用當(dāng)前系統(tǒng)的用戶名和主機(jī)名作為注釋
- 指定給密鑰添加注釋(通常是郵箱或用戶名,方便識(shí)別密鑰用途)
-f ~/.ssh/key:指定密鑰輸出的位置,會(huì)生成以下2個(gè)文件- ?? 私鑰:
~/.ssh/key - ?? 公鑰:
~/.ssh/key.pub
- ?? 私鑰:
ssh-keygen -t ed25519 -C "fengyehong123@example.com" -f ~/.ssh/key
1.3 ssh-copy-id 上傳公鑰到指定的服務(wù)器
- 命令執(zhí)行之后,會(huì)把公鑰的內(nèi)容給追加到對(duì)方服務(wù)器的
~/.ssh/authorized_keys文件中
ssh-copy-id -i ~/.ssh/key.pub apluser@172.22.118.28
1.4 服務(wù)器的公鑰指紋查看
1.4.1 ssh-keyscan 在客戶端查看對(duì)方服務(wù)器的公鑰指紋
- 注意:這種方式不能 100% 保證安全(容易被中間人攻擊),除非所在的網(wǎng)絡(luò)環(huán)境受到信任
$ 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)
- 指定查看某種加密方式所對(duì)應(yīng)的密鑰
$ 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 在服務(wù)器端查看公鑰指紋
- 服務(wù)器的公鑰都保存在
/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查看指定服務(wù)器對(duì)應(yīng)的完整公鑰
| 命令 | 顯示內(nèi)容 | 含義 |
|---|---|---|
| ssh-keygen -F <IP> | 顯示的是完整公鑰(Base64) | known_hosts 中保存的原始公鑰 |
| ssh-keygen -lf ~/.ssh/known_hosts | 顯示的是指紋(SHA256 hash) | 便于人工比對(duì)、防止被偽造 |
當(dāng)連接服務(wù)器成功之后,服務(wù)器的公鑰會(huì)被保存到
- Linux環(huán)境:
~/.ssh/known_hosts - Windows環(huán)境:
$HOME/.ssh/known_hosts
可以通過 -F 配置項(xiàng)查詢指定服務(wù)器對(duì)應(yīng)的公鑰
$ 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查看的是服務(wù)器的完整公鑰(Base64編碼后),并不是公鑰的指紋 - 可以通過下面的命令將Base64編碼后完整公鑰轉(zhuǎn)換為公鑰指紋,方便比對(duì)
# 服務(wù)器端查看公鑰指紋 apluser@FengYeHong-HP:~$ ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub 256 SHA256:R6Ra3HpmUF8+MgTj2Rd7guogV2STz1mjLhfIGA7fJB8 root@FengYeHong-HP (ED25519) # 在客戶端將Base64編碼后完整公鑰轉(zhuǎn)換為公鑰指紋 $ echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICw5prT13UbYsJw4qzWDpq34WjbVpuT5xqNvb5hXMH8w" | ssh-keygen -lf - 256 SHA256:R6Ra3HpmUF8+MgTj2Rd7guogV2STz1mjLhfIGA7fJB8 no comment (ED25519)
- 可以通過下面的命令批量查看服務(wù)器保存到客戶端的全部公鑰的指紋
$ 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)
- 需要:如果服務(wù)器使用的不是默認(rèn)端口的話,需要指定端口才能查看
$ 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刪除指定服務(wù)器對(duì)應(yīng)的公鑰
當(dāng)遠(yuǎn)程服務(wù)器被重新安裝、密鑰被更新或 IP 被他人占用時(shí),就會(huì)出現(xiàn)類似于下面的警告
?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ 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# ??????翻譯成中文就是??????
該主機(jī)的公鑰指紋跟 ~/.ssh/known_hosts 文件儲(chǔ)存的不一樣,必須處理以后才能連接。
這時(shí),你需要確認(rèn)是什么原因,使得公鑰指紋發(fā)生變更,到底是惡意劫持,還是管理員變更了 SSH 服務(wù)器公鑰。
# ??????翻譯成中文就是??????
如果服務(wù)器是值得被信任的,可以通過-R配置項(xiàng)刪除保存在known_hosts 文件中的服務(wù)器公鑰
當(dāng)通過ssh命令再次連接服務(wù)器時(shí),新的服務(wù)器公鑰指紋就會(huì)被重新添加到known_hosts 文件中。
# 刪除指定服務(wù)器對(duì)應(yīng)的公鑰 $ 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 # 再次連接時(shí)會(huì)出現(xiàn)提示 $ 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查看連接的詳細(xì)信息

2.2-p指定端口號(hào)
ssh -p 22 apluser@172.22.118.28
2.3 連接遠(yuǎn)程服務(wù)器的時(shí)候執(zhí)行命令
2.3.1 連接單臺(tái)服務(wù)器時(shí),執(zhí)行命令
# 要指定的命令可以不帶單引號(hào) ssh apluser@172.22.118.28 ls -l ~/work/ # 但最好還是帶著單引號(hào) ssh apluser@172.22.118.28 'ls -l ~/work/'
2.3.2 批量連接多臺(tái)服務(wù)器時(shí)執(zhí)行命令
執(zhí)行后,只需要輸入服務(wù)器的密碼即可
for i in {1..2}; do ssh c1kap1${i}a 'ls -l /data/work'; done
如果使用的TeamTerm連接linux服務(wù)器的話,還可以寫一個(gè)ttl腳本來批量執(zhí)行
; ----------------------------------------- exec_cmd = "'ls -l /data/work/'" SSH_PWD = 'pwd001' ; ----------------------------------------- for i 1 2 ; 拼接ssh命令 sprintf2 ssh_cmd 'ssh c1kap1%da %s' i exec_cmd ; 執(zhí)行ssh命令 sendln ssh_cmd wait 'password:' sendln SSH_PWD wait '$' next
2.4-t強(qiáng)制分配一個(gè)偽終端
- 默認(rèn)情況下,如果你用 ssh 執(zhí)行一個(gè)命令(比如
ssh user@host ls),ssh 不會(huì)分配交互終端,而是直接執(zhí)行命令輸出結(jié)果。 - 但是如果執(zhí)行
sudo ls -ld /*這種需要交互式輸入的命令,就會(huì)報(bào)錯(cuò) - 此時(shí)使用
-t分配一個(gè)偽終端,可以進(jìn)一步輸入命令
# ??????遠(yuǎn)程連接服務(wù)器時(shí)候,執(zhí)行sudo 命令?????? $ ssh -t apluser@172.22.118.28 'sudo ls -ld /* | head' apluser@172.22.118.28's password: [sudo] password for apluser: drwxr-xr-x 3 root root 4096 Jun 7 07:26 /Docker lrwxrwxrwx 1 root root 7 Oct 26 2022 /bin -> usr/bin drwxr-xr-x 2 root root 4096 Apr 18 2022 /boot drwxr-xr-x 8 root root 3160 Aug 11 14:42 /dev drwxr-xr-x 74 root root 4096 Aug 11 18:26 /etc drwxr-xr-x 3 root root 4096 May 25 20:35 /home -rwxrwxrwx 1 root root 2724464 Apr 24 08:34 /init lrwxrwxrwx 1 root root 7 Oct 26 2022 /lib -> usr/lib lrwxrwxrwx 1 root root 9 Oct 26 2022 /lib32 -> usr/lib32 lrwxrwxrwx 1 root root 9 Oct 26 2022 /lib64 -> usr/lib64 Connection to 172.22.118.28 closed.
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
一文詳解Apache如何配置虛擬目錄監(jiān)聽多個(gè)端口
在Web開發(fā)和服務(wù)器管理中,Apache HTTP服務(wù)器是一個(gè)非常流行的開源Web服務(wù)器軟件,本文將介紹如何配置Apache服務(wù)器,使其能夠通過不同的端口監(jiān)聽多個(gè)虛擬目錄2025-09-09
centos 7中設(shè)置tomcat 7為系統(tǒng)服務(wù)的方法詳解
這篇文章主要給大家介紹了關(guān)于在centos 7中設(shè)置tomcat 7為系統(tǒng)服務(wù)的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。2017-06-06
Linux中切換用戶出現(xiàn)bash-4.2$問題解決
這篇文章主要給大家介紹了關(guān)于Linux中切換用戶出現(xiàn)bash-4.2$問題解決的相關(guān)資料,我們需要進(jìn)行一個(gè)復(fù)盤,只有發(fā)生問題,才能嘗試著去解決問題,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
linux服務(wù)器中的遠(yuǎn)程訪問問題小結(jié)
在php程序中運(yùn)用fopen或者socket的時(shí)候,報(bào)一下錯(cuò)誤php_network_getaddresses: getaddrinfo failed: Temporary failure in name2012-01-01
Linux drm_syncobj機(jī)制原理與應(yīng)用方式
DRM_syncobj是Linux內(nèi)核中用于GPU同步的抽象,支持二元與時(shí)間線語義,提供高效用戶接口,實(shí)現(xiàn)跨進(jìn)程/驅(qū)動(dòng)同步,滿足現(xiàn)代圖形API如Vulkan的復(fù)雜需求2025-09-09

