ssh 命令 #
ssh
(Secure Shell)是一个用于安全远程登录和执行命令的网络协议。它提供了加密的通信会话,可以在不安全的网络中安全地连接到远程系统。
语法 #
ssh [选项] [用户@]主机 [命令]
常用选项 #
选项 | 描述 |
---|---|
-p 端口 |
指定连接的端口号(默认为22) |
-i 身份文件 |
指定用于身份验证的私钥文件 |
-l 用户名 |
指定登录的用户名 |
-v |
详细模式(可以使用多个v增加详细程度,如-vv或-vvv) |
-X |
启用X11转发 |
-Y |
启用可信X11转发 |
-C |
启用压缩 |
-f |
在执行命令前将ssh放入后台 |
-N |
不执行远程命令(用于端口转发) |
-L [本地地址:]本地端口:远程主机:远程端口 |
本地端口转发 |
-R [远程地址:]远程端口:本地主机:本地端口 |
远程端口转发 |
-D [本地地址:]本地端口 |
动态端口转发(SOCKS代理) |
-o 选项 |
指定额外的选项 |
-q |
安静模式,禁止大多数警告和诊断消息 |
-t |
强制分配伪终端 |
常见用法 #
1. 连接到远程服务器 #
ssh username@hostname
例如:
2. 使用非标准端口连接 #
ssh -p 2222 username@hostname
3. 使用私钥文件连接 #
ssh -i ~/.ssh/id_rsa username@hostname
4. 在远程服务器上执行命令 #
ssh username@hostname command
例如:
ssh [email protected] 'ls -la'
5. 启用X11转发(在远程服务器上运行图形应用程序) #
ssh -X username@hostname
6. 本地端口转发(SSH隧道) #
ssh -L 8080:localhost:80 username@hostname
这会将本地的8080端口转发到远程服务器的80端口。
7. 远程端口转发 #
ssh -R 8080:localhost:80 username@hostname
这会将远程服务器的8080端口转发到本地的80端口。
8. 设置SOCKS代理 #
ssh -D 1080 username@hostname
这会在本地1080端口创建一个SOCKS代理。
9. 保持连接活动(防止超时断开) #
ssh -o ServerAliveInterval=60 username@hostname
10. 禁用主机密钥检查(不推荐用于生产环境) #
ssh -o StrictHostKeyChecking=no username@hostname
SSH配置文件 #
SSH客户端配置文件位于~/.ssh/config
,可以简化常用连接的配置:
Host myserver
HostName example.com
User username
Port 2222
IdentityFile ~/.ssh/id_rsa_example
ServerAliveInterval 60
使用配置文件后,可以简单地使用:
ssh myserver
SSH密钥管理 #
1. 生成SSH密钥对 #
ssh-keygen -t rsa -b 4096
2. 将公钥复制到远程服务器(启用无密码登录) #
ssh-copy-id username@hostname
或手动添加:
cat ~/.ssh/id_rsa.pub | ssh username@hostname "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
3. 管理SSH代理 #
eval $(ssh-agent) # 启动SSH代理
ssh-add ~/.ssh/id_rsa # 添加私钥到代理
高级用法 #
1. 多跳SSH(通过跳板机连接) #
ssh -J user1@jumphost user2@destination
或在配置文件中:
Host destination
HostName destination.internal
User user2
ProxyJump user1@jumphost
2. 使用SSH配置别名 #
在~/.bashrc
或~/.bash_aliases
中添加:
alias sshdev='ssh -i ~/.ssh/dev_key user@dev-server'
3. 保持SSH会话(使用screen或tmux) #
ssh user@host -t 'screen -DR mysession'
4. 通过SSH挂载远程文件系统(需要sshfs) #
sshfs user@host:/remote/path /local/mountpoint
5. 通过SSH传输文件(使用scp或rsync) #
scp file.txt user@host:/remote/path/
rsync -avz -e ssh source/ user@host:/remote/path/
安全最佳实践 #
- 使用SSH密钥而不是密码认证
- 禁用root用户直接SSH登录
- 更改默认SSH端口
- 使用强密码和强密钥(RSA 4096位或ED25519)
- 限制可以使用SSH的用户
- 使用防火墙限制SSH访问
- 启用两因素认证
- 定期更新SSH服务器和客户端
- 监控SSH登录尝试
- 使用
fail2ban
阻止暴力破解攻击
常见问题排查 #
连接被拒绝 #
ssh: connect to host example.com port 22: Connection refused
可能的原因:
- SSH服务未运行
- 防火墙阻止了连接
- SSH服务运行在不同的端口
主机密钥验证失败 #
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
可能的原因:
- 远程服务器已重新安装
- 中间人攻击(需谨慎)
解决方法:
ssh-keygen -R hostname
权限问题 #
Permissions 0644 for '/home/user/.ssh/id_rsa' are too open.
解决方法:
chmod 600 ~/.ssh/id_rsa
提示 #
- 使用
~/.ssh/config
文件可以大大简化SSH连接管理 - 对于频繁连接的服务器,设置SSH密钥认证可以提高安全性和便利性
- 使用SSH代理可以避免重复输入密码
- 对于不稳定的网络连接,使用
mosh
(mobile shell)可能比SSH更好 - 使用
sshrc
可以在连接时自动加载自定义配置 - 在脚本中使用SSH时,考虑使用
-o BatchMode=yes
选项避免交互提示