SSH 常用命令与技巧
2021年12月12日
预计阅读:7min
SSH 常用命令与技巧
SSH (Secure Shell) 是一种加密网络协议,用于在不安全的网络上安全地操作网络服务。本文汇总了常用的SSH命令和技巧。
基本连接
# 基本连接
ssh username@hostname
# 指定端口连接
ssh -p 2222 username@hostname
# 使用密钥文件连接
ssh -i /path/to/private_key username@hostname
# 启用压缩
ssh -C username@hostname
# 启用详细输出,用于调试
ssh -v username@hostnameShell脚本执行
# 普通执行
sh test.sh
# 使用解释器执行
bash test.sh
# 以可执行文件方式执行(需先添加执行权限)
chmod +x test.sh
./test.sh文件传输 (SCP)
# 从远程下载文件到本地
scp username@hostname:/path/to/remote/file /path/to/local/file
# 从本地上传文件到远程
scp /path/to/local/file username@hostname:/path/to/remote/file
# 递归复制整个目录
scp -r username@hostname:/path/to/remote/dir /path/to/local/dir
# 指定端口
scp -P 2222 -r username@hostname:/path/to/remote/file /path/to/local/dir
# 保留文件属性
scp -p username@hostname:/path/to/remote/file /path/to/local/file端口转发与SSH隧道
SSH 隧道是一种通过 SSH 协议在两台计算机之间建立安全连接的方法,可以用于突破防火墙限制、保护网络流量安全、访问内部网络资源等场景。
本地端口转发 (Local Port Forwarding)
将本地端口的流量转发到远程服务器上的目标端口。
# 基本格式
ssh -L 本地端口:目标主机:目标端口 中间服务器
# 示例:访问本地8080端口等同于访问example.com的80端口
ssh -L 8080:example.com:80 username@jumphost
# 只绑定到本地环回接口(更安全)
ssh -L 127.0.0.1:8080:example.com:80 username@jumphost
# 在后台运行隧道
ssh -fNL 8080:example.com:80 username@jumphost使用场景:
- 安全访问防火墙后的内部服务
- 加密不安全的协议流量
- 绕过地理限制访问服务
远程端口转发 (Remote Port Forwarding)
将远程服务器上的端口流量转发到本地或其他目标主机。
# 基本格式
ssh -R 远程端口:目标主机:目标端口 远程服务器
# 示例:将远程服务器的2222端口映射到本地22端口
ssh -R 2222:localhost:22 username@remotehost
# 绑定到所有接口(SSH服务器需要配置GatewayPorts yes)
ssh -R 0.0.0.0:2222:localhost:22 username@remotehost
# 在后台运行隧道
ssh -fNR 2222:localhost:22 username@remotehost使用场景:
- 暴露无公网IP的本地服务
- 临时内网穿透
- 远程管理内网设备
动态端口转发 (Dynamic Port Forwarding)
创建SOCKS代理,将所有流量通过SSH服务器转发。
# 基本格式
ssh -D 本地端口 远程服务器
# 示例:在本地1080端口创建SOCKS代理
ssh -D 1080 username@hostname
# 限制只绑定到本地环回接口
ssh -D 127.0.0.1:1080 username@hostname
# 在后台运行代理
ssh -fND 1080 username@hostname使用场景:
- 安全浏览网页(浏览器配置SOCKS代理)
- 绕过网络限制
- 多协议加密代理
高级隧道选项
# 多跳隧道
ssh -L 8080:internalhost:80 -J username@jumphost1,username@jumphost2 username@finalhost
# 持久化连接(自动重连)
autossh -M 0 -L 8080:internalhost:80 username@hostname
# 压缩传输数据
ssh -C -L 8080:internalhost:80 username@hostname
# 禁用终端分配(纯隧道模式)
ssh -NL 8080:internalhost:80 username@hostname常见隧道参数
-L:本地端口转发-R:远程端口转发-D:动态端口转发(SOCKS代理)-N:不执行远程命令(适用于纯转发)-f:在后台运行-C:启用压缩-g:允许远程主机连接到本地转发端口-J:通过跳板机连接
免密码登录
# 生成SSH密钥对
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# 将公钥复制到远程服务器
ssh-copy-id username@hostname
# 手动将公钥添加到远程服务器
cat ~/.ssh/id_rsa.pub | ssh username@hostname "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"SSH配置文件技巧
在~/.ssh/config中添加配置,简化连接命令:
# 基本配置
Host myserver
HostName example.com
User username
Port 2222
IdentityFile ~/.ssh/id_rsa_special
# 跳板机配置
Host private-server
HostName 192.168.1.100
User admin
ProxyJump jumphost
# 全局设置
Host *
ServerAliveInterval 60
Compression yesSudo免输密码
#!/bin/bash
# 注意:这仅适用于测试环境,生产环境请使用更安全的方式
sudo -S command << EOF
your_password
EOF
# 或者配置sudoers文件
# 在终端运行:sudo visudo
# 添加:username ALL=(ALL) NOPASSWD: ALL高级SSH安全设置
# 禁用密码认证,仅使用密钥认证
# 编辑/etc/ssh/sshd_config:
PasswordAuthentication no
# 更改默认端口
# 编辑/etc/ssh/sshd_config:
Port 2222
# 限制特定用户登录
# 编辑/etc/ssh/sshd_config:
AllowUsers user1 user2
# 重启SSH服务
sudo systemctl restart sshd其他有用的命令
# 测试SSH连接而不执行命令
ssh -T username@hostname
# 在远程主机执行单个命令
ssh username@hostname "ls -la /tmp"
# 通过SSH运行图形应用程序
ssh -X username@hostname firefox
# 保持SSH连接活跃
ssh -o ServerAliveInterval=60 username@hostname更多SSH相关信息,请参考SSH Agent转发了解如何设置SSH代理转发。