在之前的帖子中,我们通过 SSH 密钥生成(Key Generation)完成了安全 SSH 连接的准备工作。

查看之前的帖子: SSH keygen:新手的完美指南

现在是时候了解如何通过 SSH 实际连接到远程服务器了。SSH 命令比想象中要简单,但了解一些原则和有用的选项可以让你更加高效地使用。


怎样编写 SSH 命令?

SSH 命令的基本格式如下:

ssh [选项] [用户名]@[主机地址] [命令]

让我们详细看看每个元素的含义。

  1. ssh:运行 SSH 客户端的命令。

  2. [选项]:可以指定各种控制 SSH 连接方式的选项。例如,可以使用特定密钥文件或设置端口转发等功能。(后面会详细介绍。)

  3. [用户名]:要连接的远程服务器的用户帐户名称。如果本地计算机的用户名与远程服务器的用户名相同,则可以省略。

  4. [主机地址]:要连接的远程服务器的 IP 地址或域名。

  5. [命令](可选):如果希望 SSH 连接后立即在远程服务器上执行的命令,可以在这里输入。如果省略此部分,则可以登录到服务器并使用交互式 shell。

命令编写原则和易记小贴士

SSH 命令明确地告诉我们“哪个用户要连接到哪个服务器?”

  • 基本原则: ssh 用户名@主机地址

    • 示例: ssh ubuntu@192.168.1.100(以 ubuntu 账户连接到 192.168.1.100 服务器)
    • 示例: ssh root@mywebserver.com(以 root 账户连接到 mywebserver.com 服务器)
    • 易记小贴士:

    • “我(本地用户)要进到那里(远程服务器)的谁(远程用户)!” 想想这个。

    • ssh(我要连接) [用户名]@(谁) [主机地址](在哪里)
    • 经常连接的服务器可以利用 ~/.ssh/config 文件,这样就无需每次输入长地址,而是使用别名(Alias)轻松连接。(这一部分会在下一个帖子中更详细地介绍!)

深入探讨有用的 SSH 选项

SSH 提供了多种选项以适应不同情况,功能强大。下面介绍一些核心选项。

SSH 小精灵引导选项的场景

1. -i <IdentityFile>:指定特定的私钥文件

当你有多个 SSH 密钥时,可以使用特定的私钥连接到特定的服务器。默认使用 ~/.ssh/id_rsa~/.ssh/id_ed25519,但当你用其他名称创建密钥或管理多个密钥时,非常有用。

  • 用法: ssh -i ~/.ssh/my_custom_key ubuntu@my_server.com
  • 示例:

ssh -i ~/.ssh/id_ed25519_my_server ubuntu@example.com
    输入'/home/youruser/.ssh/id_ed25519_my_server' 的密钥短语:

2. -p <Port>:指定远程服务器的 SSH 端口

大多数 SSH 服务器默认使用 22 号端口。但是出于安全考虑,管理员经常会更改 SSH 端口。在这种情况下,需要使用 -p 选项指定更改的端口号。

  • 用法: ssh -p 2222 your_user@your_server.com(连接到 2222 号端口)
  • 示例:

    ssh -p 2222 myuser@192.168.1.100
    	无法验证主机的真实性 '192.168.1.100:2222 (...)'。
    	你确定要继续连接吗(yes1/no/[fingerprint])?yes
    	警告:永久添加 '192.168.1.100:2222'(ED25519)到已知主机列表。
    	上次登录:2024年6月17日 星期一 10:00:00,从 your_ip
    	myuser@server:~ $

     

3. -X:启用 X11 转发(运行图形程序)

当你需要在本地计算机的屏幕上显示远程服务器上安装的 GUI(图形用户界面)应用程序时,使用此选项。使用 X Window System,并且本地系统上必须运行 X 服务器(macOS 需要 XQuartz,Windows 需要 PuTTY + VcXsrv 等)。

  • 用法: ssh -X your_user@your_server.com
  • 示例:

    ssh -X myuser@remote-gui-server.com
    myuser@remote-gui-server:~ $ firefox &

    连接后在远程服务器上运行 firefox(本地屏幕上会弹出 firefox 窗口)。
    性能较差或网络延迟严重时可能会不方便。

4. -L <LocalPort>:<RemoteHost>:<RemotePort>:本地端口转发(Local Port Forwarding)

将来自本地计算机特定端口(LocalPort)的连接通过 SSH 隧道转发到远程服务器(RemoteHost)的特定端口(RemotePort)。通常在需要连接防火墙后面的服务时非常有用,或者在本地开发的应用程序需要访问远程数据库时。

  • 用法: ssh -L 8080:localhost:80 your_user@your_server.com
    • 此命令将所有进入本地计算机 8080 号端口的连接经由 your_server.com 转发到 your_server.com 内部的 80 号端口(localhost:80 指的是 your_server.com 自身)。
  • 示例:

    • 当无法直接访问远程服务器的 Web 服务器(80 号端口),但是可以通过 SSH 连接时:

      ssh -L 8080:localhost:80 myuser@my_web_server.com

        执行此命令后,在本地 Web 浏览器中访问 http://localhost:8080
        实际上效果与访问 my_web_server.com 的 80 号端口相同。

    • my_db_app 需要连接到远程 db_server.internal 的 3306 号 MySQL 端口,但 db_server.internal 仅可从 my_app_server.com 访问时:

      ssh -L 3307:db_server.internal:3306 myuser@my_app_server.com

            执行此命令后,my_db_app 从 localhost:3307 访问时
            将通过 my_app_server.com 连接到 db_server.internal 的 3306 号端口。

      • (使用 3307 的原因是本地可能已经有一个使用 3306 号端口的 MySQL。)

5. -N:只维持端口转发,不执行远程命令

-L-D(动态端口转发,SOCKS 代理)选项一起使用,开启 SSH 会话但不在远程服务器上执行 shell 命令,仅维持端口转发功能。通常在后台维持端口转发隧道时非常有用。

  • 用法: ssh -N -L 8080:localhost:80 your_user@your_server.com
  • 示例:

    ssh -N -L 8080:localhost:80 myuser@my_web_server.com &

        在后台(&)保持端口转发隧道并可以从本地浏览器访问

6. -f:将 SSH 会话切换到后台

此选项在 SSH 连接成功后将 SSH 客户端进程发送到后台。通常与 -N 选项一起使用,以便在后台维持端口转发隧道。

  • 用法: ssh -f -N -L 8080:localhost:80 your_user@your_server.com
  • 示例:

    ssh -f -N -L 8080:localhost:80 myuser@my_web_server.com

        执行此命令后,终端控制权将立即返回,SSH 隧道将在后台执行。
        可以使用 ps aux | grep ssh 命令检查进程


总结

在这篇文章中,我们探讨了 SSH 命令的基本结构和一些常用的核心选项。特别是通过 -p 指定端口和通过 -L 进行端口转发,这在实际工作中非常常用,因此强烈建议大家掌握。

在下一个帖子中,我们将探讨如何利用 ~/.ssh/config 文件更加方便地管理 SSH 连接。如果你有任何问题,请随时在评论中留下!