Linux ssh-keygen系列命令与ssh命令的使用详解

 更新时间:2025年11月11日 11:30:02   作者:fengyehongWorld  
ssh-keygen用于生成SSH密钥对,用于无密码登录远程服务器,ssh-copy-id用于将公钥上传到远程服务器,查看服务器公钥指纹可以使用ssh-keyscan或在服务器端查看,ssh-F可以查看指定服务器的完整公钥,-R可以删除保存的公钥,ssh命令可以查看连接详情、指定端口号、执行命令等

一. 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

可以通过 -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脚本来批量执行

; -----------------------------------------
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_cmd
	wait 'password:'
	
	sendln SSH_PWD
	wait '$'
next

2.4-t强制分配一个伪终端

  • 默认情况下,如果你用 ssh 执行一个命令(比如 ssh user@host ls),ssh 不会分配交互终端,而是直接执行命令输出结果。
  • 但是如果执行sudo ls -ld /*这种需要交互式输入的命令,就会报错
  • 此时使用-t分配一个伪终端,可以进一步输入命令
# 👇👇👇远程连接服务器时候,执行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.

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 一文详解Apache如何配置虚拟目录监听多个端口

    一文详解Apache如何配置虚拟目录监听多个端口

    在Web开发和服务器管理中,Apache HTTP服务器是一个非常流行的开源Web服务器软件,本文将介绍如何配置Apache服务器,使其能够通过不同的端口监听多个虚拟目录
    2025-09-09
  • centos 7中设置tomcat 7为系统服务的方法详解

    centos 7中设置tomcat 7为系统服务的方法详解

    这篇文章主要给大家介绍了关于在centos 7中设置tomcat 7为系统服务的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来跟着小编一起学习学习吧。
    2017-06-06
  • Linux中切换用户出现bash-4.2$问题解决

    Linux中切换用户出现bash-4.2$问题解决

    这篇文章主要给大家介绍了关于Linux中切换用户出现bash-4.2$问题解决的相关资料,我们需要进行一个复盘,只有发生问题,才能尝试着去解决问题,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • Linux查看进程的所有信息的方法示例

    Linux查看进程的所有信息的方法示例

    这篇文章主要介绍了Linux查看进程的所有信息的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • linux提示未找到命令unzip和zip的解决方案

    linux提示未找到命令unzip和zip的解决方案

    这篇文章主要介绍了linux提示未找到命令unzip和zip的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 对Linux终端使用socks5代理的方法详解

    对Linux终端使用socks5代理的方法详解

    今天小编就为大家分享一篇对Linux终端使用socks5代理的方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • linux服务器中的远程访问问题小结

    linux服务器中的远程访问问题小结

    在php程序中运用fopen或者socket的时候,报一下错误php_network_getaddresses: getaddrinfo failed: Temporary failure in name
    2012-01-01
  • Linux drm_syncobj机制原理与应用方式

    Linux drm_syncobj机制原理与应用方式

    DRM_syncobj是Linux内核中用于GPU同步的抽象,支持二元与时间线语义,提供高效用户接口,实现跨进程/驱动同步,满足现代图形API如Vulkan的复杂需求
    2025-09-09
  • linux如何开启关闭防火墙

    linux如何开启关闭防火墙

    在Linux系统中,管理防火墙是重要的安全任务,本文介绍了如何关闭防火墙,设置开机不启动防火墙,以及如何检查防火墙状态,特别地,对于CentOS7系统,提及了Firewalld服务的安装和管理,通过这些步骤,可以有效地控制系统的防火墙设置,确保系统安全
    2024-10-10
  • yum安装本地rpm软件方案详解

    yum安装本地rpm软件方案详解

    这篇文章主要介绍了yum安装本地rpm软件方案详解,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01

最新评论