Linux

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > Linux > Linux ssh-keygen系列命令与ssh命令

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

作者:fengyehongWorld

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

一. ssh-keygen相关命令

1.1 简介

ssh-keygen 是一个用于 创建 SSH 密钥对(公钥和私钥) 的命令行工具,主要用于 SSH 认证。这些密钥可以用来:

 SSH 密钥对的原理简述

这样就能实现:免密码、安全登录远程主机。

1.2 生成密钥

ssh-keygen -t ed25519 -C "fengyehong123@example.com" -f ~/.ssh/key

1.3 ssh-copy-id 上传公钥到指定的服务器

ssh-copy-id -i ~/.ssh/key.pub apluser@172.22.118.28

1.4 服务器的公钥指纹查看

1.4.1 ssh-keyscan 在客户端查看对方服务器的公钥指纹

$ 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 在服务器端查看公钥指纹

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)便于人工比对、防止被伪造

当连接服务器成功之后,服务器的公钥会被保存到

可以通过 -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=
# 服务器端查看公钥指纹
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强制分配一个伪终端

# 👇👇👇远程连接服务器时候,执行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.

总结

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

您可能感兴趣的文章:
阅读全文