在之前的帖子中,我们通过 SSH 密钥生成(Key Generation)完成了安全 SSH 连接的准备工作。
查看之前的帖子: SSH keygen:新手的完美指南
现在是时候了解如何通过 SSH 实际连接到远程服务器了。SSH 命令比想象中要简单,但了解一些原则和有用的选项可以让你更加高效地使用。
怎样编写 SSH 命令?
SSH 命令的基本格式如下:
ssh [选项] [用户名]@[主机地址] [命令]
让我们详细看看每个元素的含义。
-
ssh
:运行 SSH 客户端的命令。 -
[选项]
:可以指定各种控制 SSH 连接方式的选项。例如,可以使用特定密钥文件或设置端口转发等功能。(后面会详细介绍。) -
[用户名]
:要连接的远程服务器的用户帐户名称。如果本地计算机的用户名与远程服务器的用户名相同,则可以省略。 -
[主机地址]
:要连接的远程服务器的 IP 地址或域名。 -
[命令]
(可选):如果希望 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 提供了多种选项以适应不同情况,功能强大。下面介绍一些核心选项。
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
自身)。
- 此命令将所有进入本地计算机 8080 号端口的连接经由
-
示例:
-
当无法直接访问远程服务器的 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 连接。如果你有任何问题,请随时在评论中留下!
目前没有评论。