Skip to content

SSH

🔑 简介

安全外壳协议 (Secure Shell Protocol, SSH) 是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。SSH 默认使用 TCP 端口 22

SSH 最常见的用途是远程加密登录系统,例如:

  • 本地加密登录远程服务器
  • Github 身份验证,进行代码的克隆和推送

🔑 SSH 密钥

SSH 密钥是一对密钥(私钥公钥

私钥公钥
文件无后缀文件后缀为.pub
保密,存放在个人电脑上可以公开,上传至服务器
用于加密数据用于解密数据

在本机(主机1)生成 SSH 密钥对,将公钥上传至远程服务器(主机2/3),可以在多个场景中使用 SSH 密钥进行身份验证:

  1. 登陆远程服务器(可能是本地局域网,也可能是广域网,例如图中主机2)
  2. Github 身份验证(例如图中主机3),可以完成代码的克隆和推送

对于不同的服务器可以生成不同的密钥,这样可以区分不同的服务器,也可以区分不同的账户

ssh 连接示意图

SSH 密钥和配置文件通常存放在 ~/.ssh/ 目录下(~ 代表用户的家目录)

  • Linux 中 ~/home/<username>
  • MacOS 中 ~/Users/<username>
  • Windows 中 ~C:\Users\<username>
shell
~/.ssh/
├── config            # SSH 配置文件
├── id_rsa            # 私钥
├── id_rsa.pub        # 公钥
├── id_rsa_<name>     # 私钥
├── id_rsa_<name>.pub # 公钥
├── ...               # 其他密钥
└── known_hosts       # 存放已知的主机公钥

SSH 身份认证过程如下:

  1. 「客户端」发送自己的「公钥」给「服务器」
  2. 「服务器」用自己的「私钥」加密一个随机字符串,发送给「客户端」
  3. 「客户端」用自己的「私钥」解密这个字符串,发送给「服务器」
  4. 「服务器」用「客户端」的「公钥」解密这个字符串。如果解密成功,认证通过;之后的通信都是用对称加密算法进行加密

🔑 生成 SSH 密钥

SSH 密钥和配置文件通常存放在 ~/.ssh/ 目录下,如果没有该文件夹,可以手动创建:

shell
mkdir -p ~/.ssh

在主机上使用 ssh-keygen 生成 SSH 密钥的命令如下:

shell
ssh-keygen [-f <filename>] [-C <comment>] [-N ""] [...]

其他可选参数

  • -f 指定生成的密钥文件。默认生成的密钥文件为 ~/.ssh/id_rsa

如果有多个服务器可以设置不同的名称加以区分,例如设置一个名为 ~/.ssh/sshkey-github 的密钥专为 Github 使用(✅ 推荐这种命名密钥的做法)

  • -b 指定密钥长度,默认为 2048,通过 -b 4096 可以设置为 4096
  • -t 指定密钥类型,默认为 rsa,通过 -t dsa 可以设置为 dsa
  • -C 添加注释信息,可以为邮箱地址,例如 -C "abc@gmail.com",也可以为空
  • -N 指定密钥的密码,如果不需要密码可以为空,一般来说是不需要密码的
  • --help 查看帮助信息

一些例子:

shell
# 生成默认密钥 ~/.ssh/id_ed25519
ssh-keygen
# 生成默认密钥 ~/.ssh/sshkey [推荐]
ssh-keygen -f ~/.ssh/sshkey       # 为了方便,一般不需要给自己电脑上的密钥再设定密码
ssh-keygen -f ~/.ssh/sshkey -N "" # 因此可以默认密码为空
shell
# 生成名为 ~/.ssh/sshkey-github 的密钥,用于 Github
ssh-keygen -f ~/.ssh/sshkey-github
shell
# 生成名为 ~/.ssh/sshkey-github 的密钥,用于 Github,并添加注释
ssh-keygen -f ~/.ssh/sshkey-github -C "Github"
shell
# 生成名为 ~/.ssh/sshkey 的密钥,长度为 4096
ssh-keygen -f ~/.ssh/sshkey -b 4096

运行后会提示输入密钥文件的保存路径,直接(一路)回车即可,会在默认路径 ~/.ssh/ 下生成密钥文件:

  • sshkey 为私钥
  • sshkey.pub 为公钥

🔑 密钥管理

可以针对不同的服务器配置多个密钥,需要编 ~/.ssh/config 文件,如果没有则手动创建。文件内容如下:

bash
Host my_server
  HostName <host_name>
  Port 22
  User <user_name>
  ForwardAgent yes
  PreferredAuthentications publickey
  IdentityFile <identity_file>
  • Host 指定一个或多个服务器的名称(别名),可以使用通配符(例如 *.example.com)来匹配多个,例如 my_server,也可以就是 IP 地址,登录的时候使用该名称
  • HostName 指定服务器的 IP 地址或域名
  • Port 指定服务器的 SSH 端口,如果是默认端口 22 可以省略该项
  • User 指定登录服务器的用户名,例如 ubuntu
  • IdentityFile 指定私钥的路径,例如 ~/.ssh/sshkey-github
  • IdentitiesOnly 指定只使用指定的私钥进行认证,默认为 no ,可以在 ssh agent 提供了多个密钥的情况下,只使用指定的密钥进行认证
  • ForwardAgent 指定是否转发本地的 SSH Agent
  • PreferredAuthentications 指定登录服务器优先的认证方式,例如 publickey, password, keyboard-interactive
  • StrictHostKeyChecking 指定是否检查主机的公钥,有三个选项(ask,yes,no)如下:
    • ask 默认值,首次连接位置服务器时,询问是否接受公钥,接受则添加到 known_hosts 文件中,下次连接时不再询问
    • yes 则每次验证远程服务器的公钥,如果与之前不同则会拒绝连接;需要手动更新 known_hosts 文件
    • no 不检查公钥,直接添加到 known_hosts 文件,不推荐使用

如果有多个服务器,可以添加多个 Host,并且指定不同的私钥加以认证区分

之后直接:

bash
# 登录 my_server
ssh my_server
# 上传文件到 my_server
scp my_server:~/file.txt ~/file.txt

注意,这时候如果采用 ssh <user>@<ip> 的方式登录,还是需要输入密码的,因为没有指定私钥

首次分发公钥时,也可以直接对已经配置好的 Host 别名执行:

bash
ssh-copy-id my_server

已运行中的服务器新增用户,如何分发公钥

如果服务器已经运行了一段时间,后来又新增了一个用户,那么这个用户如何拿到公钥,取决于他当前是否还能先登录进去。

如果服务器此时仍然允许密码登录,那么最简单,直接对新用户执行:

bash
ssh-copy-id -i ~/.ssh/your_key.pub newuser@server

输入一次新用户密码后,公钥会写入:

bash
/home/newuser/.ssh/authorized_keys

如果服务器已经设置了 PasswordAuthentication no,那么新用户通常无法再直接通过 ssh-copy-id 上传公钥,因为它底层仍然依赖普通 SSH 登录。

这时通常由已有管理员账户代为创建新用户的公钥文件:

bash
mkdir -p /home/newuser/.ssh
chmod 700 /home/newuser/.ssh
vim /home/newuser/.ssh/authorized_keys
chmod 600 /home/newuser/.ssh/authorized_keys
chown -R newuser:newuser /home/newuser/.ssh

把新用户的公钥内容粘贴到 authorized_keys 中即可。也可以直接追加:

bash
echo 'ssh-ed25519 AAAA... comment' >> /home/newuser/.ssh/authorized_keys
chmod 600 /home/newuser/.ssh/authorized_keys
chown -R newuser:newuser /home/newuser/.ssh

这里最关键的是三件事:

  • ~newuser/.ssh 权限通常应为 700
  • authorized_keys 权限通常应为 600
  • 文件和目录属主应为 newuser:newuser

更稳妥的运维习惯通常是:新增用户时,就由管理员顺手把公钥部署好,而不是先开账号、再让对方自己想办法传公钥。

SSH config 进阶

当服务器数量变多,或者开始接触内网跳板机时,~/.ssh/config 还可以继续复用、拆分和组合。

保持连接

bash
Host *
  ServerAliveInterval 180

ServerAliveInterval 表示客户端每隔一段时间主动发送一次保活消息。对于会话容易被网络设备回收、长时间挂着终端不操作的场景,这个配置通常很有用。

使用通配符复用公共配置

bash
Host dev-*
  User ubuntu
  Port 22
  ServerAliveInterval 180

Host dev-api-01
  HostName 10.0.0.11

Host dev-api-02
  HostName 10.0.0.12

可以把一组服务器的公共配置写到同一个通配符 Host 中,每台机器只保留自己的差异项,例如 HostNameIdentityFile

拆分多个配置文件

bash
# ~/.ssh/config
Include ~/.ssh/config.d/*.conf

~/.ssh/config 里管理的主机越来越多时,可以按环境或项目拆分到 ~/.ssh/config.d/ 下,例如 prod.confstaging.confgithub.conf,这样更容易维护,也更方便共享部分配置。

通过跳板机登录内网主机

bash
Host jumper
  HostName 1.2.3.4
  User username

Host prod-*
  User username
  ProxyJump jumper
  ServerAliveInterval 180

Host prod-api-01
  HostName 172.16.0.11

配置好 ProxyJump 后,可以直接执行 ssh prod-api-01scp ./file.txt prod-api-01:/tmp/,不需要先手动登录跳板机再二次连接。

注意:走 ProxyJump 时,认证依然是本地客户端直接对目标机器进行,因此公钥要部署到目标机器上,而不是只放在跳板机上。

服务器之间直接拷贝文件

如果两个远程主机都已经在 ~/.ssh/config 中配置好了别名,可以直接在本地发起远程到远程的复制:

bash
# Server1 与 Server2 可以直接互通
scp Server1:/path/to/file Server2:/path/to/file2

# 两台服务器不能直连时,让本地机器做中转
scp -3 Server1:/path/to/file Server2:/path/to/file2

-3 表示让本地机器作为中转节点,这在跨网段、跨堡垒机或安全组不互通时很实用。

密钥管理-Github

采用这种方式也可以配置多个 github/gitee/HuggingFace 账户:

bash
Host github.com
  HostName github.com
  User <Your_Github_Name>
  AddKeysToAgent yes
  IdentityFile ~/.ssh/sshkey-github
bash
Host Github
  HostName github.com
  User <Your_Github_Name>
  AddKeysToAgent yes
  IdentityFile ~/.ssh/sshkey-github

连接测试的时候需要改成

bash
ssh -T git@github.com
bash
ssh -T git@Github

使用 git 获取时,需要根据 Host 的名称进行 clone 操作,例如:

bash
git clone git@github.com:<github_username>/<repo>.git
bash
git clone git@Github:<github_username>/<repo>.git

VSCode 中的远程资源管理器(Remote Explorer)中,显示远程服务器列表就是通过读取 ~/.ssh/config 文件中的 Host 来显示的,可以直接点击连接

🔑 SSH 密钥的作用

登录远程服务器

使用 SSH 登陆远程服务器前,需要确保远程服务器安装并且开启了 SSH 服务,一般来说 Linux 服务器会默认安装 openssh-server ,而一些桌面版的 Linux 系统可能没有安装 SSH 服务,需要手动安装。对于 Ubuntu ,可以如下安装

shell
sudo apt install openssh-server -y

在登陆的时候,会自动将「本地私钥」和「服务器公钥」进行匹配,如果匹配成功,则可以免密登录。这在使用 VSCode 远程开发的时候非常有用,可以免去每次输入密码的麻烦。 (关于 VScode 远程开发可以参考 "Remote Development using SSH")

使用 ssh-copy-id 命令可以将「本地公钥」传输协议到远程服务器并存储在「公钥认证」文件中,例如:

shell
ssh-copy-id -i <identity_file> <user>@<hostname>
  • -i 指定「本地公钥」的路径,例如 -i ~/.ssh/sshkey.pub
  • <user>@<hostname> 远程服务器的用户名和主机名,例如 ubuntu@192.168.1.1
  • -p 如果远程服务器的 SSH 端口不是默认的 22 端口,可以通过 -p <port> 指定端口

(对于 win 系统,没有 ssh-copy-id 命令,)也可以手动将「本地公钥」复制到远程服务器的 ~/.ssh/authorized_keys 文件中 (如果不存在,需要手动创建) ,但是推荐使用 ssh-copy-id 命令(win 可以使用 git bash),因为该命令会自动创建文件,并自动设置权限

这里提供一个生成密钥并自动上传至服务器的脚本 ssh-keygen-auto.sh ,高亮部分需要自行修改:

查看完整代码
shell
# ========================================
key_name="server"       # 生成的密钥名称
username="ubuntu"       # 服务器用户名,如果仅生成密钥,此项可忽略
server_ip="192.168.1.6" # 服务器 IP
port="22"               # 服务器端口,默认 22
# ========================================

# 生成密钥文件路径,密钥名称为 sshkey-<key_name>
key_file="$HOME/.ssh/sshkey-${key_name}"

[ ! -d "$HOME/.ssh" ] && mkdir -p $HOME/.ssh

# 生成本地密钥
if [ -f ${key_file} ]; then
    echo "密钥已存在: ${key_file}"
else
    comment=${comment:-"${key_file}"}   # 如果 comment 为空,则注释为 key_file
    ssh-keygen -t rsa -f ${key_file} -C "${comment}" -N ""
fi

# 上传公钥 至 服务器
ssh-copy-id -i ${key_file}.pub -p ${port} ${username}@${server_ip} 


echo ""
echo " SEE :${key_file}"
echo ""

Linux Server 初始化时的 SSH 配置

下面这套思路适用于大多数 Linux 发行版,文中的安装命令、服务名和防火墙示例以 Ubuntu 为主。

Ubuntu Server 首次安装完成后,默认通常已经带有 openssh-server,但是否允许远程登录、是否启用密钥登录、是否禁止 root 直登,仍然建议手动确认一遍。

1. 确认 SSH 服务已经安装并运行

bash
sudo apt update
sudo apt install -y openssh-server
sudo systemctl enable --now ssh
sudo systemctl status ssh

如果系统里没有安装 SSH 服务,上述命令会直接补齐;如果已经安装,则主要用于确认服务状态。

不同发行版在这里的差异主要有三类:

  • 包管理器不同:Ubuntu / Debian 常用 apt,CentOS / RHEL / Rocky / AlmaLinux 常用 dnfyum,Arch Linux 常用 pacman,openSUSE 常用 zypper
  • 服务名不同:Ubuntu 常见是 ssh,很多其他发行版常见是 sshd
  • 防火墙工具不同:Ubuntu 常见是 ufw,RHEL 系常见是 firewalld

常见对应关系:

bash
# Debian / Ubuntu
apt install -y openssh-server
systemctl enable --now ssh

# CentOS / RHEL / Rocky / AlmaLinux
dnf install -y openssh-server
systemctl enable --now sshd

# Arch Linux
pacman -S openssh
systemctl enable --now sshd

# openSUSE
zypper install -y openssh
systemctl enable --now sshd

2. 先用普通用户登录,不要直接启用 root 日常操作

Ubuntu 的推荐方式是:

  • 保留普通用户,例如安装时创建的 ubuntu 或你自己的账户
  • 通过 sudo 提权执行管理操作
  • 不把 root 当成日常登录账号

如果必须切换到 root 执行一次性操作,优先使用:

bash
sudo -i

而不是长期开放 root 远程直登。

3. 生成本机密钥并分发到服务器

在本地机器生成专门给这台服务器使用的密钥:

bash
ssh-keygen -f ~/.ssh/sshkey-linux-server -C "linux-server"

然后把公钥上传到服务器:

bash
ssh-copy-id -i ~/.ssh/sshkey-linux-server.pub <user>@<server-ip>

如果 SSH 端口不是默认 22,记得补上 -p

bash
ssh-copy-id -i ~/.ssh/sshkey-linux-server.pub -p <port> <user>@<server-ip>

测试连接:

bash
ssh -i ~/.ssh/sshkey-linux-server <user>@<server-ip>

4. 给这台服务器配置 ~/.ssh/config

bash
Host linux-server
  HostName <server-ip>
  User <user>
  Port 22
  IdentityFile ~/.ssh/sshkey-linux-server
  IdentitiesOnly yes
  ServerAliveInterval 180

后续直接执行:

bash
ssh linux-server
scp ./local.file linux-server:/tmp/

5. 关闭密码登录,保留密钥登录

在确认公钥登录已经可用之后,再修改服务端配置:

bash
sudo vim /etc/ssh/sshd_config

建议至少确认下面几项:

ini
PubkeyAuthentication yes   # 允许公钥认证
PasswordAuthentication no  # 禁用所有用户的 SSH 密码认证,减少暴力破解风险
PermitRootLogin no         # 禁止 root 直接远程登录

这里要特别注意顺序:

  • ssh-copy-id 通常依赖“当前还允许登录的认证方式”把公钥写入远程用户的 ~/.ssh/authorized_keys
  • 如果你还没有把公钥传上去,就先设置了 PasswordAuthentication no,那么 ssh-copy-id 往往也无法再通过密码登录完成上传
  • 更稳妥的顺序是:先 ssh-copy-id,再测试公钥登录成功,最后再关闭密码登录

ssh-copy-id 本身不是服务端的特殊通道,底层仍然是在走普通 SSH 登录。

重启 SSH:

bash
sudo systemctl restart ssh

如果你改过 SSH 端口,也建议在新终端先验证连接成功,再关闭旧会话,避免把自己锁在门外。

6. 如需开放防火墙,先放通 SSH

Ubuntu 常见写法:

bash
sudo ufw allow OpenSSH
sudo ufw enable
sudo ufw status

如果你把 SSH 改到了自定义端口,例如 2222,则需要显式放通:

bash
sudo ufw allow 2222/tcp

7. 不推荐直接开启 root SSH 登录

有些场景下会临时搜索到如下配置:

ini
PermitRootLogin yes

这确实可以让 root 直接登录,但通常只适合非常临时、非常受控的场景。对于长期运行的 Linux Server,更合理的方式依然是:

  • 普通用户登录
  • sudo 提权
  • 密钥认证
  • 禁止密码登录

如果只是需要 root 权限执行管理任务,不必因此开放 root 的远程登录入口。

Github 身份验证

Hugging Face 等也是如此操作添加

Github 支持使用 SSH 在 GitHub.com 上的存储库中访问和写入数据,参考 about-ssh

在 Github 中 Settings -> SSH and GPG keys -> New SSH key 中添加密钥,将本地生成的公钥(id_rsa_github.pub)复制到 Github 中,该密钥的命名可以自定义,建议和设备绑定,并且加上密钥名称,例如 Ubuntu22.04-id_rsa(配置名称后需要设置 config 文件,参考 ssh config

添加之后,需要进行连接测试以建立一次连接,例如:

shell
ssh -T git@github.com
ssh -T git@Github # 如果在 ~/.ssh/config 中配置了 Host Github
ssh -T git@hf.co  # for verifying Hugging Face

按照 Host 名称进行连接,参考 Github 配置

测试成功后出现如下提示则说明连接成功

shell
Hi User! You've successfully authenticated, but GitHub does not provide shell access.

随后在 clone 项目采用 ssh 的方式,会自动与 Github 建立连接,Github 会将公钥和「当前设备中」的私钥进行匹配,如果匹配成功,则可以免密操作。基于 ssh 的仓库在 push 会自动使用 ssh 进行验证,不需要输入用户名和密码

注意:如果是多设备,需要将每个设备的公钥都添加到 Github 中,这样才能实现多设备免密操作。每个设备生成的私钥都不一样,当然了,把密钥复制到其他设备也是可以的,但是这样就失去了 SSH 密钥的意义了。

HTTPS 和 SSH clone 方式的区别:

  • HTTPS 可以任意用户克隆,SSH 只能克隆自己(有权限的)的项目,并且需要配置 SSH 密钥
  • 在推送代码的时候,HTTPS 需要输入用户名和密码,SSH 不需要输入用户名和密码

🧰 可选工具

如果你已经配置好了 SSH config,但仍然需要更高效地搜索主机、批量执行命令或更方便地传文件,可以再考虑下面这些工具:

  • tssh:在 ssh 之上增加主机搜索、密码加密保存和基于 trzsz 的文件传输,适合机器很多、偶尔又必须使用密码登录的场景
  • ClusterShell:适合同时对多台机器执行命令、聚合输出、做差异对比或批量分发文件

这些工具不是 SSH 的必需品,但在服务器较多时会明显提升效率。

端口转发

🚪 修改 ssh 默认登陆端口

参考 “修改云服务器远程默认端口 | 腾讯云”

一些情况下,为了安全性,需要修改 ssh 默认登陆端口,可以通过修改 /etc/ssh/sshd_config 文件中的 Port 选项来修改 ssh 默认登陆端口,例如:

shell
Include /etc/ssh/sshd_config.d/*.conf

#Port 22
Port <xxxx>   # <xxxx> 是新的端口号
AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::


# 如果需要支持 root 用户通过密码登录,需要修改 `PermitRootLogin` 选项,例如:
# 默认:禁用密码登录
#PermitRootLogin prohibit-password
# 允许 root 用户通过密码登录(不推荐)
#PermitRootLogin yes

添加新端口后,需要修改防火墙规则

bash
SSH_PORT=<xxxx>   # <xxxx> 是新的端口号
firewall-cmd --permanent --zone=public --add-port=${SSH_PORT}/tcp    # 添加新端口
firewall-cmd --reload      # 更新防火墙规则
firewall-cmd --list-ports  # 查看已开放的端口

# firewall-cmd --permanent --zone=public --remove-port=${SSH_PORT}/tcp # 移除端口

firewalld 可能需要安装 apt update && apt install firewalld -y

重启 ssh 服务使配置生效:

shell
systemctl restart sshd

Ubuntu 24.04 LTS 后需要执行如下命令,原因可以参考 Changing Port in sshd_config requires calling systemctl daemon-reload

shell
systemctl daemon-reload
systemctl restart ssh.socket

🧪 常见 SSH 命令参数

如果你不想把配置写进 ~/.ssh/config,很多常见行为也可以直接通过 ssh 命令参数传入:

bash
ssh [options] <user>@<host>

指定端口 -p

bash
ssh -p 2222 user@host

当远程服务器没有使用默认端口 22 时,可以通过 -p 显式指定端口。

指定私钥 -i

bash
ssh -i ~/.ssh/sshkey user@host

当某台主机需要使用特定私钥登录,但你又暂时不想写入 ~/.ssh/config 时,-i 最直接。

传递配置项 -o

bash
ssh -o ServerAliveInterval=180 user@host
ssh -o ServerAliveInterval=180 -o ServerAliveCountMax=3 user@host
ssh -o StrictHostKeyChecking=no user@host
ssh -o ConnectTimeout=10 user@host
ssh -o BatchMode=yes user@host
ssh -o IdentitiesOnly=yes -o IdentityFile=~/.ssh/sshkey-work user@host
ssh -o PreferredAuthentications=publickey user@host
ssh -o Compression=yes user@host
ssh -o ProxyJump=jumper user@host
ssh -o RequestTTY=force user@host
ssh -o ExitOnForwardFailure=yes -f -N -L 5432:127.0.0.1:5432 user@host

-o 用来传递任意 ssh_config 配置项,适合一次性的连接需求。比如:

  • ServerAliveInterval 表示客户端每隔一段时间发送一次保活消息
  • ServerAliveCountMax 表示连续多少次没有收到响应后断开连接
  • StrictHostKeyChecking 可控制首次连接时的主机公钥校验行为
  • ConnectTimeout 指定连接超时时间,避免网络异常时卡太久
  • BatchMode 禁止交互式询问,适合脚本、CI 或自动化任务
  • IdentitiesOnly 指定只使用明确声明的私钥,避免本地 agent 里密钥太多时误用
  • IdentityFile 指定私钥文件,本质上是 -i 的配置项写法
  • PreferredAuthentications 指定优先使用的认证方式,例如 publickey
  • Compression 开启压缩,在带宽较差的链路上可能有帮助
  • ProxyJump-J 的配置项写法
  • RequestTTY 控制是否分配伪终端,例如 autoyesforceno
  • ExitOnForwardFailure 用于端口转发场景,若转发建立失败则立即退出,避免后台挂着一个不可用连接

例如下面这些一次性命令,在日常排障和自动化里都很常见:

bash
# 临时指定用户名、端口和私钥
ssh -o User=ubuntu -o Port=2222 -o IdentityFile=~/.ssh/sshkey-work host

# 只允许公钥认证,避免回退到密码交互
ssh -o PreferredAuthentications=publickey -o BatchMode=yes user@host

# 通过跳板机进入内网,并设置连接超时
ssh -o ProxyJump=jumper -o ConnectTimeout=10 user@10.0.0.12

# 强制分配 TTY,在远程执行需要交互式终端的命令
ssh -o RequestTTY=force user@host "sudo systemctl status nginx"

# 建立数据库隧道,若端口转发失败则直接退出
ssh -o ExitOnForwardFailure=yes -f -N -L 5432:127.0.0.1:5432 user@host

注意:像 StrictHostKeyChecking=noUserKnownHostsFile=/dev/null 这类跳过或弱化主机校验的配置,只适合临时测试,不适合长期使用。

通过跳板机连接 -J

bash
ssh -J jumper user@host
ssh -J user@bastion user@10.0.0.12

-JProxyJump 的命令行写法,适合临时通过堡垒机或跳板机进入内网主机。

本地端口转发 -L

bash
ssh -L 8080:127.0.0.1:80 user@host

把本地 8080 端口转发到远程主机可访问的 127.0.0.1:80,常用于访问远程机器上的 Web 服务或数据库。

远程端口转发 -R

bash
ssh -R 8080:127.0.0.1:3000 user@host

把远程主机的 8080 端口转发到本地 127.0.0.1:3000,适合把本地开发服务临时暴露给远程环境。

动态代理 -D

bash
ssh -D 1080 user@host

启动一个本地 SOCKS5 代理,常用于需要经由远程主机转发流量的场景。

只建立隧道不执行命令 -N

bash
ssh -N -L 5432:127.0.0.1:5432 user@host

-N 表示登录后不执行远程命令,通常与端口转发参数一起使用。

放到后台执行 -f

bash
ssh -f -N -L 5432:127.0.0.1:5432 user@host

-f 会在认证完成后把 ssh 放到后台运行,适合长期挂着的隧道。

禁用伪终端 -T

bash
ssh -T git@github.com

-T 表示不分配 TTY,常见于 Git 平台的连通性验证,或者只执行非交互命令的场景。

转发本地 SSH Agent -A

bash
ssh -A user@host

-AForwardAgent yes 的命令行写法,适合在远程机器上继续访问其他需要 SSH 身份认证的主机。

注意:Agent 转发有安全风险,只应在可信主机上使用。

输出调试信息 -v

bash
ssh -v user@host
ssh -vv user@host
ssh -vvv user@host

连接失败、密钥未命中、跳板机链路异常时,-v / -vv / -vvv 很适合用来排查问题。

⏰ 最后更新于: