Hshen
人若无名 便可潜心练剑
GitHub Abou byHshen Hshen

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@hostname

Shell脚本执行

# 普通执行
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 yes

Sudo免输密码

#!/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代理转发。