SSH命令
SSH(Secure Shell)是一种加密网络协议,用于在不安全的网络上安全地操作网络服务。
1. SSH 是什么?
SSH 最初设计用于替代 Telnet 等不安全的远程登录协议。它通过加密技术,确保客户端与服务器之间的连接是安全的,能够防止窃听、连接劫持等攻击。
主要功能:
- 远程登录(替代 telnet/rlogin)
- 安全执行远程命令
- 安全的文件传输(配合 scp、sftp)
- 端口转发(隧道)、X11 转发等
2. 基本语法
ssh [选项] [用户@]主机 [命令]
用户:远程服务器上的用户名(若不指定,则使用当前本地用户名)主机:可以是域名、IP 地址,或 SSH 配置文件中定义的别名命令:如果提供,则在远程执行该命令后退出,不启动交互式 Shell
3. 常用选项
3.1 连接相关
| 选项 | 说明 |
|---|---|
-p <端口> | 指定远程 SSH 端口(默认 22) |
-l <用户名> | 指定登录用户名 |
-i <私钥文件> | 指定用于认证的私钥文件 |
-F <配置文件> | 指定 SSH 配置文件(默认 ~/.ssh/config) |
-o <选项> | 直接传递配置选项(如 -o ConnectTimeout=5) |
3.2 认证与安全
| 选项 | 说明 |
|---|---|
-o PasswordAuthentication=no | 禁用密码认证,只使用密钥 |
-o StrictHostKeyChecking=no | 自动接受未知主机密钥(慎用) |
-o UserKnownHostsFile=/dev/null | 忽略 known_hosts 记录 |
-v | 详细输出(用于调试),可用 -vvv 增加详细程度 |
3.3 转发与隧道
| 选项 | 说明 |
|---|---|
-L [本地地址:]本地端口:目标主机:目标端口 | 本地端口转发 |
-R [远程地址:]远程端口:目标主机:目标端口 | 远程端口转发 |
-D <端口> | 动态端口转发(SOCKS 代理) |
-X | 启用 X11 转发(图形界面) |
-Y | 启用可信 X11 转发(安全性较低) |
-A | 启用代理认证转发 |
-N | 不执行远程命令(用于端口转发) |
-f | 连接成功后进入后台(常与 -N 配合) |
3.4 其他常用
| 选项 | 说明 |
|---|---|
-t | 强制分配伪终端(用于执行需要交互的命令) |
-T | 禁用伪终端分配 |
-C | 启用压缩 |
-4 / -6 | 强制使用 IPv4 / IPv6 |
4. 配置文件
SSH 客户端配置文件通常位于:
- 系统级:
/etc/ssh/ssh_config - 用户级:
~/.ssh/config
配置文件可以简化日常使用。示例:
Host myserver
HostName 192.168.1.100
User admin
Port 2222
IdentityFile ~/.ssh/id_rsa_mykey
之后只需执行 ssh myserver 即可。
常用配置项:
Host:别名HostName:真实主机名/IPUser:用户名Port:端口IdentityFile:私钥路径ForwardAgent:是否允许代理转发ServerAliveInterval:保活时间间隔Compression:是否启用压缩
5. 密钥认证
SSH 支持使用公钥认证,比密码更安全。
5.1 生成密钥对
ssh-keygen -t ed25519 -C "your_email@example.com"
常用类型:
ed25519:推荐,安全性高,性能好rsa(3072 或 4096 位):兼容性最好
生成的文件:
~/.ssh/id_ed25519:私钥(需严格保密)~/.ssh/id_ed25519.pub:公钥(可分发)
5.2 将公钥部署到服务器
方法一:使用 ssh-copy-id
ssh-copy-id user@host
方法二:手动添加
将公钥内容追加到远程主机的 ~/.ssh/authorized_keys 文件中。
6. 常用操作示例
6.1 基本远程登录
ssh root@192.168.1.10
ssh -p 2222 admin@example.com
6.2 执行单条命令
ssh user@host "ls -la /var/log"
ssh user@host "systemctl status nginx"
6.3 本地端口转发
将远程数据库(3306)映射到本地 3307:
ssh -L 3307:localhost:3306 user@db-server
之后可以连接 localhost:3307 访问远程数据库。
6.4 远程端口转发
将本地 Web 服务(3000)暴露到远程服务器的 8080 端口:
ssh -R 8080:localhost:3000 user@public-server
这样访问 public-server:8080 就相当于访问本地的 3000 端口。
6.5 动态 SOCKS 代理
ssh -D 1080 user@server
然后在浏览器或系统中设置 SOCKS5 代理 localhost:1080,所有流量将通过 SSH 隧道转发。
6.6 跳板机(ProxyJump)
通过一台跳板机登录内部主机:
ssh -J jumpuser@jumphost targetuser@targethost
或在配置文件中使用 ProxyJump 选项。
7. 文件传输相关
虽然 scp 和 sftp 是独立命令,但它们基于 SSH。
7.1 scp 示例
# 本地 -> 远程
scp file.txt user@host:/path/
# 远程 -> 本地
scp user@host:/path/file.txt .
# 指定端口
scp -P 2222 file.txt user@host:/path/
7.2 sftp 示例
sftp user@host
进入交互式 FTP 风格界面,支持 ls、get、put、mkdir 等命令。
8. 安全建议
- 禁用密码认证(生产环境):在服务器
/etc/ssh/sshd_config中设置PasswordAuthentication no - 禁用 root 直接登录:设置
PermitRootLogin no - 使用非标准端口:修改
Port,可减少扫描攻击 - 限制登录用户:使用
AllowUsers指令 - 定期更新 SSH 软件
- 私钥加密存储:生成时设置密码短语(passphrase),可配合
ssh-agent避免重复输入
9. 故障排查
9.1 查看详细连接过程
ssh -vvv user@host
输出会显示认证方式、密钥尝试、连接建立细节。
9.2 常见错误
| 错误信息 | 常见原因 |
|---|---|
Connection refused | 端口未开放,SSH 服务未运行,或防火墙拦截 |
Permission denied (publickey) | 密钥认证失败,可能未添加公钥或私钥错误 |
Host key verification failed | 主机密钥变更,可编辑 ~/.ssh/known_hosts 删除对应行 |
Connection timed out | 网络不通或防火墙拦截 |
10. 总结
SSH 是现代 Linux/Unix 系统管理的必备工具。除了基础的远程登录,它还提供了强大的端口转发、隧道、安全传输等能力。掌握 SSH 的各种用法,可以极大提升系统管理的安全性与效率。
如需更深入了解,可以查阅:
man ssh
man ssh_config
man sshd_config

3万+

被折叠的 条评论
为什么被折叠?



