ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[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 函数 ``` <details> <summary>客户端向服务器发出的握手信息</summary> ``` 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” ``` </details> <br/> >[info] Cipher Suites字段就是客户端列出可选的加密参数集,服务器在其中选择一个自己支持的参数集 <details> <summary>服务器选择完毕之后,向客户端发出回应</summary> ``` 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” ``` </details> <br/> >[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 ```