在上一篇文章中,我們通過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賬戶連接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
  • 示例:

    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])?是

    警告:永久加入'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
  • 示例:

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

    登錄後在遠程伺服器上運行firefox(在本地屏幕上會彈出firefox窗口)

    myuser@remote-gui-server:~ $ 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可用時:

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

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 &

    可在後台(&)保持端口轉發隧道,並在本地使用瀏覽器訪問

    ```

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連接。如果有任何疑問,隨時在下方留言!