在上一次的帖子中,我们完成了通过 SSH 密钥生成(Key Generation)为安全 SSH 连接做好准备。

查看上一个帖子 : SSH 密钥生成:完美的初学者指南

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


如何编写 SSH 命令?

SSH 命令的基本格式如下:

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

我们来详细看看每个元素的含义吧?

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

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

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

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

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

命令书写原则和记忆要点

SSH 命令是一个明确告知我们“哪个用户将连接哪个服务器?”的结构。

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

    • 示例: ssh ubuntu@192.168.1.100 (连接到 192.168.1.100 服务器的 ubuntu 账户)
    • 示例: ssh root@mywebserver.com (连接到 https://www.google.com/search?q=mywebserver.com 服务器的 root 账户)
    • 记忆要点:

    • “我(本地用户)要连接那边(远程服务器)的谁(远程用户)!” 想想这句话。

    • 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
  • 示例:

    Bash

    ``` 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 端口连接)
  • 示例:

    Bash

    ``` 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 来自你的_ip

    myuser@server:~ $

    ```

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

当远程服务器上安装了 GUI(图形用户界面)应用程序,并希望在本地计算机的屏幕上显示时,可以使用此选项。采用 X Window System,需确保本地系统上运行着 X 服务器(macOS 需 XQuartz,Windows 需 PuTTY + VcXsrv 等)。

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

    ```Bash ssh -X myuser@remote-gui-server.com

    连接后在远程服务器上运行 firefox(本地屏幕上出现 firefox 窗口)

    myuser@remote-gui-server:~ $ firefox & ```

    (如果性能不佳或网络延迟严重,可能会造成不便。)

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

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

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

    • 当无法直接连接到远程服务器的 Web 服务器(80 端口),只有 SSH 可用时:

      ```Bash 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 访问时:

      ```Bash 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 的原因是本地可能已经有一个 MySQL 使用 3306 端口。)

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

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

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

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

    在后台(&)打开端口转发隧道,随后在本地访问 Web 浏览器

    ```

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

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

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

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

    执行此命令后,终端控制立即返回,SSH 隧道将在后台运行。

    可以通过命令 ps aux | grep ssh 查看进程

    ```


总结

在本篇帖子中,我们探讨了 SSH 命令的基本结构和常用的关键选项。尤其是使用 -p 指定端口和使用 -L 进行端口转发是在实际工作中非常常用的,强烈建议您记住。

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