1 概述
SSH (Secure Shell) 是一种用于远程登录和其他网络服务之间的加密协议,SSH 提供了一个安全的通信渠道,以保护数据的机密性和完整性。而 ssh 命令则通过 SSH 协议连接到远程主机,实现远程登录和执行命令,它加密会话中的所有通信,确保数据传输的安全性。
2 语法
ssh [options] [user@]hostname [command]
参数
- [user@]hostname:要连接的远程主机的用户名和主机名。
- 如果不指定用户名,系统会默认使用当前的本地登录用户作为远程登录用户。这种方式适用于某些特定场景,例如在本地和远程主机之间进行文件传输时,可以简化命令格式;
- hostname可以是具体的域名,再解析成具体IP,也可以直接指定IP;
- [command]:可选的在远程主机上执行的命令;
选项
- -l user:指定要登录的用户。
- -p port:指定连接到远程主机的端口号,默认是22。
- -i identity_file:指定身份验证文件(私钥文件)。
- -v:详细模式,可以显示调试信息。
- -C:启用压缩。
- -N:不执行远程命令,只进行端口转发。
- -f:后台运行。
- -L local_port:remote_host:remote_port:本地端口转发。
- -R remote_port:local_host:local_port:远程端口转发。
- -D [bind_address:]port:动态应用程序级端口转发。
3 示例
# 指定端口连接:
ssh -p 2222 user@hostname
# 使用身份验证文件:
ssh -i /path/to/private_key user@hostname
# 在远程主机上执行命令:
ssh user@hostname ls -al
# 后台运行且不执行命令:
ssh -f -N user@hostname
4 端口转发
ssh服务需要 ssh客户端 和 sshd服务端共同实现。既然涉及到两个机器,就需要和IP、Port打交道。
4.1 本地端口转发
本地转发一般是在跳转机/跳板机/堡垒机的场景。即 本地机器不能直接访问目标机器,需将 sshd 服务机作为跳转机,使得本地机器可以通过跳转机,访问到目标机器。
在本地机器执行:
ssh -L local_port:target_ip:target_port jump_user@jump_ip
其中:
- local_port:本地端口,默认为22;
- target_ip:目标机器IP,是相对于jump_ip而言,如果就是jump_ip本身,则target_ip值可以填成localhost或127.0.0.1;
- target_port:目标机器端口;
- jump_user:从本地机器登录到跳板机时的用户名;
- jump_ip:跳板机IP;
注意:从跳板机登录到目标机器时,未注明登录用户,说明它的登录用户就是本地机器登录跳板机所使用的账号。
4.2 远端端口转发
如果本地机器不能ssh访问跳板机,但是跳板机可以ssh访问本地机器,那么就可以在跳板机上进行远端端口转发,让本地机器可以访问到目标机器。
在跳板机上执行:
ssh -R local_port:target_ip:target_port local_user@local_ip
5 长保持配置
在ssh登录到目标机器后,如果没有操作,到了固定时间就会断开:
SSH Client_loop: send disconnect: Broken pipe Error
可以通过以下配置,让ssh连接进行长期保持:
5.1 服务端sshd配置
在 /etc/ssh/sshd_config 文件中,找到以下两个配置项,并设为对应的值:
# 指定服务端向客户端请求心跳消息的时间间隔, 单位为秒。默认是0, 表示不发送
ClientAliveInterval: 60
# 服务器发出请求后,客户端没有响应的次数最大值。达到此值后, 服务端就自动断开与客户端的连接。正常情况下, 客户端不会不响应,使用默认值3即可。
ClientAliveCountMax: 3
修改后,重启 sshd 服务,让配置生效。
systemctl restart sshd
或
service sshd restart
5.2 客户端ssh配置
SSH Client 读取参数优先顺序:命令行 > 用户配置文件 > 系统配置文件
5.2.1 命令行
ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=3 user_name@remote_ip
5.2.2 用户配置文件 ~/.ssh/config
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
chmod 600 ~/.ssh/config
5.2.3 系统配置文件 /etc/ssh/sshd_config
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
6 其他问题
6.1 密钥类型不匹配
Unable to negotiate with 1.2.3.4 port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dss
本地和远程进行密钥比对时发现不匹配,对方支持的是ssh-rsa,ssh-dss。那就在本地文件中配置一下,我这里是在 ./ssh/config文件中:
Host *
HostKeyAlgorithms +ssh-rsa,ssh-dss
PubkeyAcceptedKeyTypes +ssh-rsa,ssh-dss
保存退出,重新连接即可。如果是其他的,把相应的值加在后面即可,多个用英文逗号分隔。