在上一篇文章中,我們透過 SSH 密鑰生成(Key Generation)為安全的 SSH 連接做好了準備。

上一篇文章連結 : SSH keygen:完整的新手指南

現在是時候了解如何真實地使用 SSH 來訪問遠端伺服器了。SSH 的命令比想象中簡單,但了解一些原則和有用的選項能幫助我們更加高效地使用它。


SSH 命令,該如何撰寫呢?

SSH 命令的基本格式如下:

ssh [選項] [用戶名]@[主機地址] [命令]

讓我們仔細看看每一個要素的含義吧?

  1. ssh: 執行 SSH 客戶端的命令。

  2. [選項]: 可以指定各種控制 SSH 連接方式的選項。例如,使用特定的密鑰文件或設置端口轉發等功能。(下文會詳細介紹。)

  3. [用戶名]: 要訪問的遠端伺服器的用戶賬號名稱。如果本地計算機的用戶名和遠端伺服器的用戶名相同,可以省略。

  4. [主機地址]: 要訪問的遠端伺服器的 IP 地址或域名。

  5. [命令](選擇性): 如果在 SSH 連接後希望立即執行某個命令,則在此輸入。執行完這個命令後,SSH 會話將結束。如果省略這部分,可以登錄到伺服器並使用交互式的 Shell。

命令撰寫原則及易記的小技巧

SSH 命令的結構是清晰地指示「哪個用戶要訪問哪個伺服器?」。

  • 基本原則: ssh 用戶名@主機地址

    • 示例: ssh ubuntu@192.168.1.100 (使用 ubuntu 賬號訪問 192.168.1.100 伺服器)
    • 示例: ssh root@mywebserver.com (使用 root 賬號訪問 https://www.google.com/search?q=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
    Enter passphrase for key '/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
    	The authenticity of host '192.168.1.100:2222 (...)' can't be established.
    	Are you sure you want to continue connecting (yes1/no/[fingerprint])? yes
    	Warning: Permanently added '192.168.1.100:2222' (ED25519) to the list of known hosts.
    	Last login: Mon Jun 17 10:00:00 2024 from 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)

通過 SSH 隧道將來自本地計算機特定端口(LocalPort)的連接轉發到遠端伺服器(RemoteHost)特定端口(RemotePort)的功能。主要用於訪問防火牆後的服務,或本地開發的應用程序需要訪問遠端數據庫時非常有用。

  • 用法: ssh -L 8080:localhost:80 your_user@your_server.com
    • 這個命令會將所有進入本地計算機 8080 端口的連接通過 your_server.com 轉發到 your_server.com 內部的 80 端口(localhost:80your_server.com 本身)上。
  • 示例:

    • 當無法直接訪問遠端伺服器的網頁伺服器(80 端口),只能使用 SSH 時:

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

        執行完這個命令後,在本地網頁瀏覽器中訪問 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 連接。如果有任何疑問,隨時留言給我!