ssh openssh-client包
最后更新于:2022-04-02 03:51:23
[TOC]
## 安装
```
# Ubuntu 和 Debian
$ sudo apt install openssh-client
# CentOS 和 Fedora
$ sudo dnf install openssh-clients
```
## 概念
### 连接流程
1. 连接一台陌生的服务器会有如下提示
```
The authenticity of host 'foo.com (192.168.121.111)' can't be established.
ECDSA key fingerprint is SHA256:Vybt22mVXuNuB5unE++yowF7lgA/9/2bLSiO3qmYWBY.
Are you sure you want to continue connecting (yes/no)?
```
所谓“服务器指纹”,指的是 SSH 服务器公钥的哈希值
查看某个公钥的指纹:
```
$ ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key.pub
256 da:24:43:0b:2e:c1:3f:a1:84:13:92:01:52:b4:84:ff (ECDSA)
```
2. ssh 会将本机连接过的所有服务器公钥的指纹,都储存在本机的`~/.ssh/known_hosts`文件中
3.第一步选择,yes 后,公钥指纹就会存入 `~/.ssh/know_hosts`
### 服务器密钥变更
如果服务器的密钥发生变更(比如重装了 SSH 服务器),会有警告
```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ 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 the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
77:a5:69:81:9b:eb:40:76:7b:13:04:a9:6c:f4:9c:5d.
Please contact your system administrator.
Add correct host key in /home/me/.ssh/known_hosts to get rid of this message.
Offending key in /home/me/.ssh/known_hosts:36
```
如过变成的指纹可以信任, 则可以去`~/.ssh/know_hosts` 删除原来的指纹
或自动删除:
```
ssh-keygen -R hostname
```
### 加密选择
SSH 连接的握手阶段,客户端必须跟服务端约定加密参数集(cipher suite)
```
TLS_RSA_WITH_AES_128_CBC_SHA
TLS:协议
RSA:密钥交换算法
AES:加密算法
128:加密强度
CBC:加密模式
SHA:数字签名的 Hash 函数
```
>[info] Cipher Suites字段就是客户端列出可选的加密参数集,服务器在其中选择一个自己支持的参数集
>[info] Cipher Suite字段就是服务器最终选定的加密参数 ## 命令 ``` -c 参数指定加密算法 如: ssh -c blowfish,3des server.example.com 或者 ssh -c blowfish -c 3des server.example.com -C 参数表示压缩数据传输 如: ssh -C server.example.com -d 参数设置打印的 debug 信息级别,数值最高,输出的内容越详细 如: ssh –d 1 foo.com -D 参数指定本机的 Socks 监听端口,该端口收到的请求,都将转发到远程的 SSH 主机 如: ssh -D 1080 server -f 参数表示 SSH 连接在后台运行 -F 参数指定配置文件 如: ssh -F /usr/local/ssh/other_config -i 参数用于指定私钥,默认值为~/.ssh/id_dsa,服务器必须存有对应的公钥 如: ssh -i my-key server.example.com -L 参数设置本地端口转发 如: ssh -L 9999:targetServer:80 user@remoteserver 表示:所有发向本地9999端口的请求,都会经过remoteserver发往 targetServer 的 80 端口 -m 参数指定校验数据完整性的算法 -p 参数指定 SSH 客户端连接的服务器端口 -q 参数表示安静模式 -t 参数在 ssh 直接运行远端命令时,提供一个互动式 Shell 如: ssh -t server.example.com vim -v 参数显示详细信息,可以重复多次 ``` ## 场景 ### 查看系统的公钥 ``` ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key.pub ``` ### 执行远程命令(允许交互) ``` ssh username@hostname command ``` 加入 -t 参数则允许交互 ``` ssh -t username@hostname vim ``` ### 删除变更的指纹 ``` ssh-keygen -R hostname ```
';
客户端向服务器发出的握手信息
``` Handshake protocol: ClientHello Version: TLS 1.2 Random Client time: May 22, 2030 02:43:46 GMT Random bytes: b76b0e61829557eb4c611adfd2d36eb232dc1332fe29802e321ee871 Session ID: (empty) Cipher Suites Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256” Suite: TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 Suite: TLS_RSA_WITH_AES_128_GCM_SHA256 Suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA Suite: TLS_DHE_RSA_WITH_AES_128_CBC_SHA Suite: TLS_RSA_WITH_AES_128_CBC_SHA Suite: TLS_RSA_WITH_3DES_EDE_CBC_SHA Suite: TLS_RSA_WITH_RC4_128_SHA Compression methods Method: null Extensions Extension: server_name Hostname: www.feistyduck.com Extension: renegotiation_info Extension: elliptic_curves Named curve: secp256r1 Named curve: secp384r1 Extension: signature_algorithms Algorithm: sha1/rsa Algorithm: sha256/rsa Algorithm: sha1/ecdsa Algorithm: sha256/ecdsa” ```>[info] Cipher Suites字段就是客户端列出可选的加密参数集,服务器在其中选择一个自己支持的参数集
服务器选择完毕之后,向客户端发出回应
``` Handshake protocol: ServerHello Version: TLS 1.2 Random Server time: Mar 10, 2059 02:35:57 GMT” Random bytes: 8469b09b480c1978182ce1b59290487609f41132312ca22aacaf5012 Session ID: 4cae75c91cf5adf55f93c9fb5dd36d19903b1182029af3d527b7a42ef1c32c80 Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 Compression method: null Extensions Extension: server_name Extension: renegotiation_info” ```>[info] Cipher Suite字段就是服务器最终选定的加密参数 ## 命令 ``` -c 参数指定加密算法 如: ssh -c blowfish,3des server.example.com 或者 ssh -c blowfish -c 3des server.example.com -C 参数表示压缩数据传输 如: ssh -C server.example.com -d 参数设置打印的 debug 信息级别,数值最高,输出的内容越详细 如: ssh –d 1 foo.com -D 参数指定本机的 Socks 监听端口,该端口收到的请求,都将转发到远程的 SSH 主机 如: ssh -D 1080 server -f 参数表示 SSH 连接在后台运行 -F 参数指定配置文件 如: ssh -F /usr/local/ssh/other_config -i 参数用于指定私钥,默认值为~/.ssh/id_dsa,服务器必须存有对应的公钥 如: ssh -i my-key server.example.com -L 参数设置本地端口转发 如: ssh -L 9999:targetServer:80 user@remoteserver 表示:所有发向本地9999端口的请求,都会经过remoteserver发往 targetServer 的 80 端口 -m 参数指定校验数据完整性的算法 -p 参数指定 SSH 客户端连接的服务器端口 -q 参数表示安静模式 -t 参数在 ssh 直接运行远端命令时,提供一个互动式 Shell 如: ssh -t server.example.com vim -v 参数显示详细信息,可以重复多次 ``` ## 场景 ### 查看系统的公钥 ``` ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key.pub ``` ### 执行远程命令(允许交互) ``` ssh username@hostname command ``` 加入 -t 参数则允许交互 ``` ssh -t username@hostname vim ``` ### 删除变更的指纹 ``` ssh-keygen -R hostname ```