我们将参数分为几个类别,以便于理解和记忆:

(图片来源网络,侵删)
- 核心连接参数:用于指定连接目标。
- 安全与认证参数:用于身份验证和加密配置。
- 执行命令参数:用于在远程主机上执行单条命令。
- 端口转发/隧道参数:用于安全地转发网络连接。
- 调试与信息参数:用于排查问题和显示信息。
- 配置文件:
ssh的行为可以通过配置文件来简化。
核心连接参数
这些参数用于告诉 ssh 你要连接到哪里,以及以什么身份连接。
-p 或 --port
- 作用:指定远程服务器的 SSH 端口号,默认是
22。 - 示例:
# 连接到 example.com 的 2222 端口 ssh -p 2222 user@example.com
-l 或 --user
-
作用:指定登录的远程用户名,也可以直接在 前面写用户名。
-
示例:
# 登录用户为 'admin' ssh -l admin example.com # 等同于 ssh admin@example.com
-i 或 --identityfile
- 作用:指定用于身份验证的私钥文件路径,默认会使用
~/.ssh/id_rsa,~/.ssh/id_ecdsa,~/.ssh/id_ed25519等。 - 示例:
# 使用 ~/.ssh/my_custom_key 作为私钥 ssh -i ~/.ssh/my_custom_key user@example.com
-F 或 --configfile
- 作用:指定一个非默认的 SSH 配置文件。
- 示例:
# 使用 ~/my_ssh_config 文件进行连接 ssh -F ~/my_ssh_config user@example.com
安全与认证参数
这些参数用于控制认证方式和安全行为。

(图片来源网络,侵删)
-o 或 --option
-
作用:直接在命令行中指定一个配置选项,这对于临时覆盖配置文件中的设置非常有用。
-
常用选项:
StrictHostKeyChecking: 是否严格检查主机密钥。yes: 首次连接必须手动确认,拒绝未知主机,最安全。no: 自动接受并保存新主机密钥,不检查,不安全,易受中间人攻击。ask(默认): 首次连接时询问用户是否接受。
PasswordAuthentication: 是否使用密码认证。yes: 允许使用密码。no: 禁止使用密码,强制使用密钥,推荐用于生产环境。
UserKnownHostsFile: 指定 known_hosts 文件的路径。
-
示例:
# 禁用主机密钥检查(不推荐,仅用于测试) ssh -o "StrictHostKeyChecking=no" user@example.com # 禁用密码认证,强制使用密钥 ssh -o "PasswordAuthentication=no" user@example.com
-v 或 -vv 或 -vvv
-
作用:显示详细的调试信息。
v的数量越多,信息越详细,这对于排查连接问题至关重要。
(图片来源网络,侵删) -
示例:
# 显示基本调试信息 ssh -v user@example.com # 显示更详细的调试信息 ssh -vvv user@example.com
-q 或 --quiet
- 作用:安静模式,只显示错误信息,不显示警告和诊断信息。
- 示例:
# 在脚本中使用,避免输出干扰 ssh -q user@example.com "some_command"
执行命令参数
这些参数让你可以直接在远程主机上执行命令,而无需进入交互式 shell。
-C 或 --compress
- 作用:打开数据压缩,对于低速网络或执行多个命令时可以减少传输数据量。
- 示例:
# 压缩传输数据 ssh -C user@example.com "ls -l /var/log"
-N
- 作用:不执行远程命令。这个参数非常重要,通常只与端口转发结合使用。
- 示例:
# 建立一个空的 SSH 连接,用于端口转发 ssh -N -L 8080:localhost:80 user@example.com
-t 或 -tt
-
作用:强制分配伪终端,这对于在远程机器上运行需要交互式终端的程序(如
top,vim,bash -i)是必需的。-t: 分配一个伪终端。-tt: 强制分配一个伪终端,即使本地没有连接到一个终端,在脚本中运行交互式命令时很有用。
-
示例:
# 在远程服务器上打开一个交互式 bash shell ssh -t user@example.com "bash -l" # 在脚本中运行远程的交互式命令 ssh -tt user@example.com "sudo reboot"
-T
- 作用:禁用伪终端分配,当你只想执行命令,不希望看到交互式提示或格式化输出时非常有用。
- 示例:
# 执行一个命令,不分配 TTY,适合脚本 ssh -T user@example.com "some_command > output.log 2>&1"
端口转发/隧道参数
这是 SSH 最强大的功能之一,可以在不修改防火墙规则的情况下,安全地访问远程或本地网络服务。
-L (Local Port Forwarding - 本地端口转发)
-
作用:将本地机器的一个端口转发到远程机器的某个端口。
-
格式:
-L [本地主机:]本地端口:远程主机:远程端口 -
示例:
# 将本地电脑的 8080 端口,通过 example.com,转发到远程服务器 example.com 的 80 端口 # 访问 http://localhost:8080 就相当于访问了 http://example.com:80 ssh -L 8080:localhost:80 user@example.com # 将本地电脑的 3306 端口,通过 example.com,转发到数据库服务器 db.example.com 的 3306 端口 ssh -L 3306:db.example.com:3306 user@example.com
-R (Remote Port Forwarding - 远程端口转发)
- 作用:将远程机器的一个端口转发到本地机器的某个端口,这相当于在远程服务器上开了一个“洞”,指向你的本地机器。
- 格式:
-R [远程主机:]远程端口:本地主机:本地端口 - 示例:
# 在 example.com 服务器上开放 8888 端口,访问该端口就相当于访问你本地电脑的 3000 端口 # 这可以让外部网络访问你本地的开发服务器 ssh -R 8888:localhost:3000 user@example.com
-D (Dynamic Port Forwarding - 动态端口转发 / SOCKS 代理)
- 作用:在本地创建一个 SOCKS 代理服务器,所有通过这个代理的网络流量都会通过 SSH 隧道转发到远程主机。
- 格式:
-D [本地主机:]本地端口 - 示例:
# 在本地 1080 端口创建一个 SOCKS 代理 # 配置浏览器或系统代理为 socks5://localhost:1080 # 所有网络流量都会通过 example.com 转发,实现匿名访问 ssh -D 1080 user@example.com
调试与信息参数
-V
- 作用:显示
ssh程序的版本信息。 - 示例:
ssh -V # OpenSSH_8.9p1 Ubuntu-3ubuntu0.1, OpenSSL 3.0.2 15 Mar 2025
-G
- 作用:显示
ssh将要使用的配置参数(合并了默认配置、用户配置文件和命令行参数),然后退出,对于调试配置非常有用。 - 示例:
ssh -G user@example.com # 会输出大量配置项,如 port, user, identityfile 等
SSH 配置文件 (~/.ssh/config)
为了避免每次都输入一长串参数,你可以使用 SSH 配置文件,这是一个强大的功能,能让你的连接命令变得极其简洁。
文件路径:~/.ssh/config ( 代表你的家目录)
示例配置:
# Host myprod
# HostName production.server.com
# User admin
# Port 2222
# IdentityFile ~/.ssh/prod_key
# StrictHostKeyChecking yes
# Host myweb
# HostName 192.168.1.100
# User webuser
# LocalForward 8080 localhost:80
# Host github
# HostName github.com
# User git
# IdentityFile ~/.ssh/id_ed25519_github
使用方法:
配置好上述文件后,你就可以用简短的 Host 别名来连接了。
# 连接到 myprod,相当于执行 ssh -p 2222 -i ~/.ssh/prod_key admin@production.server.com ssh myprod # 连接到 myweb,会自动建立本地端口转发 ssh myweb # 克隆 GitHub 仓库,ssh 会自动使用正确的密钥 git clone git@github.com:user/repo.git
常用组合示例
-
安全地复制文件 (虽然
scp是独立命令,但它内部调用ssh):# 使用指定端口和密钥,从远程复制文件到本地 scp -P 2222 -i ~/.ssh/my_key user@example.com:/path/to/remote/file.txt /path/to/local/
-
在远程服务器上以 root 权限执行命令:
# 先切换到 root 用户,然后执行命令 ssh -t user@example.com "sudo reboot" # 或者直接以 root 用户登录(不推荐,但有时必要) ssh root@example.com
-
在后台保持端口转发:
# 使用 -N -f 让 ssh 在后台运行 ssh -N -f -L 8080:localhost:80 user@example.com
-
调试连接问题:
# 尝试连接,并显示所有调试信息 ssh -vvv user@example.com
希望这份详细的总结能帮助你全面掌握 ssh 命令的参数!
