透過 SSH X11 轉發時,GUI 應用程式無法啟動
依照上一篇文章的步驟建立了 SSH X11 轉發環境,xeyes 順利顯示在 Windows 端。然而 nautilus 卻怎麼都啟動不了。這是一篇記錄「明明 DISPLAY 已經正常運作,為什麼偏偏這個應用程式會當掉」的排查過程。
依照上一篇文章的步驟建立了 SSH X11 轉發環境,xeyes 順利顯示在 Windows 端。然而 nautilus 卻怎麼都啟動不了。這是一篇記錄「明明 DISPLAY 已經正常運作,為什麼偏偏這個應用程式會當掉」的排查過程。
這台 Fedora 43 Server 既沒有安裝 X 伺服器,也沒有安裝桌面環境。現在想從這台機器把 GUI 應用程式顯示到 Windows 電腦上。這是一篇不安裝桌面環境,改用 SSH X11 轉發只傳送「單一應用程式」的紀錄。
這篇備忘錄記錄了 SSH Local Forward。
SSH Local Forward (本地端口轉發) 是一種 SSH 隧道技術,它允許你將本地機器上的一個端口的流量,通過 SSH 連接轉發到遠端 SSH 伺服器可訪問的另一個目標主機和端口。
這通常用於訪問防火牆後面的服務,或者在本地開發環境中模擬對遠端服務的訪問。
當你設置一個本地端口轉發時:
流程簡圖:
本地應用 (localhost:LPORT) <---SSH隧道---> 本地SSH客戶端 ---加密通道---> 遠端SSH伺服器 ---非加密通道---> 目標主機:TPORT
ssh -L [本地端口]:[目標主機]:[目標端口] [SSH用戶]@[SSH伺服器]
-L:指定本地端口轉發。[本地端口]:你本地機器上將要監聽的端口號。任何發送到 localhost:[本地端口] 的流量都將被轉發。[目標主機]:遠端 SSH 伺服器能夠訪問的目標主機的 IP 地址或域名。[目標端口]:目標主機上服務的端口號。[SSH用戶]:用於登錄遠端 SSH 伺服器的用戶名。[SSH伺服器]:遠端 SSH 伺服器的 IP 地址或域名。假設:
remote-web-server.com 的 80 端口。remote-web-server.com 的 SSH 伺服器 (ssh.example.com)。localhost:8080 訪問 remote-web-server.com 的 Web 服務。命令:
ssh -L 8080:remote-web-server.com:80 [email protected]
執行此命令後,當你在本地瀏覽器中訪問 http://localhost:8080 時,你的請求會通過 ssh.example.com 轉發到 remote-web-server.com 的 80 端口。
假設:
db.example.com 的 5432 端口 (PostgreSQL)。ssh.example.com)。localhost:54320 連接到遠端資料庫。命令:
ssh -L 54320:db.example.com:5432 [email protected]
執行此命令後,你可以配置你的本地資料庫客戶端(如 psql 或 DBeaver)連接到 localhost:54320,你的連接將安全地通過 SSH 隧道轉發到遠端資料庫。
如果你希望 SSH 隧道在後台運行,並且不執行遠端命令,可以使用 -N (不執行遠端命令) 和 -f (在後台運行) 選項。
ssh -fN -L 8080:remote-web-server.com:80 [email protected]
要停止這個後台運行的隧道,你需要找到 SSH 進程並終止它。
如果你想訪問 SSH 伺服器上運行的服務,[目標主機] 可以是 localhost 或 127.0.0.1。
ssh -L 8000:localhost:8000 [email protected]
這將允許你通過本地的 localhost:8000 訪問 ssh.example.com 上運行的 8000 端口服務。
[目標主機] 必須是遠端 SSH 伺服器能夠訪問的主機。SSH Local Forward 是一個非常強大且常用的功能,它提供了一種安全、靈活的方式來訪問網絡受限的遠端服務。無論是繞過防火牆、訪問內部網絡服務還是本地開發,了解並熟練使用本地端口轉發都能極大地提高你的工作效率和安全性。
這篇備忘錄記錄了 PLINK。
PLINK (PuTTY Link) 是 PuTTY 套件中的一個命令行工具,主要用於在 Windows 環境下通過命令行執行 SSH、Telnet 和 Rlogin 連接。它對於腳本化和自動化遠端操作非常有用。
與 PuTTY GUI 相比,PLINK 提供了無需圖形界面的方式來連接遠端伺服器,非常適合在批處理文件、PowerShell 腳本或 CI/CD 環境中使用。
PLINK 是 PuTTY 套件的一部分。你不需要單獨安裝它,只需下載 PuTTY 官方網站提供的 PuTTY 套件。
plink.exe:你可以選擇下載獨立的 plink.exe 可執行文件,或者下載整個 PuTTY 安裝程式。plink.exe 放置到 PATH 路徑:為了方便在任何地方調用 plink,建議將 plink.exe 所在的目錄添加到 Windows 的環境變量 PATH 中。PLINK 的基本語法與 SSH 類似,但有其特有的選項。
plink [user@]host [command]
範例:連接到遠端伺服器並執行 ls -l 命令。
plink [email protected] ls -l /var/www
如果沒有指定命令,PLINK 會啟動一個交互式 Shell 會話。
使用 -P 選項指定端口(注意是大寫 P)。
plink -P 2222 [email protected]
PLINK 支持使用 PuTTY 專有的 .ppk 格式的私鑰文件進行身份驗證。你需要使用 PuTTYgen 工具將 OpenSSH 格式的私鑰轉換為 .ppk 格式。
plink -i C:\path o\your\private_key.ppk [email protected]
你可以將 PLINK 執行的遠端命令的輸出重定向到本地文件。
plink [email protected] "cat /etc/nginx/nginx.conf" > nginx_config.txt
通過將命令用引號括起來,可以在遠端執行多個命令。
plink [email protected] "cd /var/www/html && git pull origin main"
為了實現免密碼登錄,你需要:
生成 OpenSSH 密鑰對 (如果還沒有)。
在 Linux/WSL/Git Bash 中:ssh-keygen -t rsa -b 4096
將公鑰部署到遠端伺服器。
使用 ssh-copy-id 或手動將公鑰內容添加到遠端伺服器的 ~/.ssh/authorized_keys 文件中。
使用 PuTTYgen 將私鑰轉換為 .ppk 格式。
Load,選擇你的 OpenSSH 私鑰文件 (id_rsa)。Save private key,將其保存為 .ppk 格式。你可以選擇不設置密碼。使用 PLINK 和 .ppk 文件連接。
plink -i C:\path o\your\id_rsa.ppk [email protected] "your_command"
-ssh:強制使用 SSH 協議。-batch:防止 PLINK 提示用戶輸入密碼或接受主機密鑰(適用於腳本)。-pw password:直接在命令行中提供密碼(不安全,應盡量避免)。-N:不執行遠端命令,僅用於端口轉發(隧道)。-L, -R, -D:用於本地、遠端、動態端口轉發(SSH 隧道)。PLINK 在自動化任務中非常有用。
deploy.bat)@echo off
set KEY="C:\path o\your\private_key.ppk"
set REMOTE_DIR=/var/www/html
echo 連接到 %HOST% 並部署...
plink -i %KEY% %HOST% "cd %REMOTE_DIR% && git pull origin main && npm install && npm run build"
if %ERRORLEVEL% NEQ 0 (
echo 部署失敗!
exit /b %ERRORLEVEL%
)
echo 部署成功!
PLINK 是 Windows 用戶在命令行環境中執行 SSH 和其他遠端連接的強大工具。它在自動化腳本、CI/CD 流程以及無需圖形界面的遠端操作中扮演著重要角色。通過理解其基本用法和如何與私鑰文件結合,可以大大提高遠端管理的效率和安全性。
這篇備忘錄記錄了 SSH 公鑰認證。
SSH (Secure Shell) 公鑰認證是一種比密碼認證更安全、更便捷的遠端登錄方式。它使用非對稱加密(公鑰和私鑰對)來驗證用戶身份,無需每次都輸入密碼。
SSH 公鑰認證涉及兩部分:
當你嘗試連接遠端伺服器時:
~/.ssh/authorized_keys 文件中是否有匹配的公鑰。打開終端 (Linux/macOS) 或 Git Bash/WSL (Windows)。
運行 ssh-keygen 命令。
ssh-keygen -t rsa -b 4096 -C "[email protected]"
-t rsa:指定生成 RSA 算法的密鑰。-b 4096:指定密鑰長度為 4096 位 (建議長度,比默認的 2048 位更安全)。-C "[email protected]":添加註釋,通常是你的電子郵件地址,便於識別。系統會提示你輸入文件儲存位置。默認通常是 ~/.ssh/id_rsa。直接按 Enter 即可使用默認路徑。
系統會提示你輸入密碼 (passphrase)。強烈建議設置一個密碼,這會為你的私鑰提供額外的保護。每次使用私鑰時都需要輸入此密碼。如果你不希望每次都輸入密碼,可以留空(不推薦)。
生成成功後,你會在 ~/.ssh/ 目錄下看到兩個文件:
id_rsa:你的私鑰 (Private Key)。id_rsa.pub:你的公鑰 (Public Key)。有兩種主要方法:
ssh-copy-id (推薦)ssh-copy-id 是一個非常方便的工具,它會自動將你的公鑰複製到遠端伺服器的 ~/.ssh/authorized_keys 文件中。
ssh-copy-id user@remote_host
user:你在遠端伺服器上的用戶名。remote_host:遠端伺服器的 IP 地址或域名。系統會提示你輸入遠端伺服器的密碼(第一次連接時),然後它會完成其餘的工作。
如果你無法使用 ssh-copy-id,可以手動複製公鑰。
在本地查看公鑰內容:
cat ~/.ssh/id_rsa.pub
複製完整的輸出內容(從 ssh-rsa 開始到你的電子郵件地址結束)。
連接到遠端伺服器 (使用密碼或已有的其他認證方式)。
ssh user@remote_host
在遠端伺服器上創建 .ssh 目錄 (如果不存在) 並設置正確的權限。
mkdir -p ~/.ssh
chmod 700 ~/.ssh
將公鑰添加到 authorized_keys 文件:
echo "你的公鑰內容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
將 "你的公鑰內容" 替換為你在步驟 1 中複製的公鑰字串。
設置 authorized_keys 文件的權限:
chmod 600 ~/.ssh/authorized_keys
正確的權限非常重要,否則 SSH 服務器會拒絕使用該文件。
設置完成後,嘗試使用 SSH 連接到遠端伺服器:
ssh user@remote_host
如果一切順利,系統會提示你輸入私鑰的密碼 (如果你設置了),然後你就可以成功登錄而無需輸入遠端伺服器的用戶密碼。
如果你設置了私鑰密碼,每次連接時都會被提示輸入。SSH Agent 可以幫助你解決這個問題。它是一個程序,在記憶體中保存你的解密私鑰,這樣你在一個會話中只需輸入一次密碼。
eval "$(ssh-agent -s)" # 啟動 ssh-agent
ssh-add ~/.ssh/id_rsa # 添加私鑰 (會提示輸入密碼)
為了進一步提高安全性,一旦確認公鑰認證正常工作,你可以在遠端伺服器的 SSH 配置中禁用密碼認證。
在遠端伺服器上編輯 SSH 服務器配置文件:
sudo vim /etc/ssh/sshd_config
查找並修改以下行:
PasswordAuthentication no
(確保前面沒有 # 注釋符號)
重啟 SSH 服務:
sudo systemctl restart sshd # 或 sudo service ssh restart
SSH 公鑰認證是遠端伺服器管理的基本安全實踐。它提供了更高的安全性、便利性和自動化潛力。遵循這些步驟,你可以輕鬆地為你的伺服器設置公鑰認證,並享受更安全高效的遠端連接。
slappasswd 指令是用來為 OpenLDAP 產生密碼的工具,預設使用 SSHA 對密碼進行雜湊處理。
在 SSHA 中,產生的雜湊值最後 4 個位元組為鹽值(salt)。認證時,系統會將輸入的密碼與儲存的鹽值組合後產生雜湊,並比對是否與儲存的雜湊相符。
以下程式在輸入正確密碼(例如 admin)時,會產生與原始雜湊相同的結果。
require 'base64'
require 'digest'
pass = 'admin'
ssha = '{SSHA}23AUBfRZytVFNpe7onuFhyCSJOHRzCWh'
ssha =~ /{.+}(.+)/
salt256s = Base64.decode64(Regexp.last_match(1)).unpack('C*'[-4..-1])
salt = salt256s.pack('C*')
b_ssha = Digest::SHA1.digest(pass + salt)
Base64.strict_encode64(
(b_ssha.unpack('C*') + salt256s).pack('C*')
)
[EOL]
Permission denied連線至 localhost:22 時,出現以下錯誤:
hikari@localhost: Permission denied (publickey,keyboard-interactive).

Administrators 群組(即「系統管理員使用者」)預設會從 C:\ProgramData\ssh\administrators_authorized_keys 讀取公鑰進行驗證。
需要將其改為 $env:userprofile\.ssh\authorized_keys。
以系統管理員權限開啟 C:\ProgramData\ssh\sshd_config,將以下兩行註解掉:

- Match Group administrators
- AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
+ #Match Group administrators
+ # AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
儲存後,重新啟動服務。
Restart-Service sshd
這篇備忘錄記錄了在 Termux 上使用 SSH 的方法。
Termux 是一個 Android 上的終端模擬器和 Linux 環境應用程式,它允許你運行許多 Linux 命令和工具。SSH 是一種安全的網絡協議,用於在不安全的網絡上安全地執行網絡服務。
在 Termux 中,你可以將其作為 SSH 客戶端連接到遠端服務器,也可以將其設置為 SSH 服務器,以便從其他設備連接到你的 Android 設備。
Termux 提供了一個 OpenSSH 套件,你可以通過 pkg 命令安裝:
pkg update && pkg upgrade
pkg install openssh
安裝完成後,你可以使用 ssh 命令連接到遠端服務器:
ssh user@hostname_or_ip
例如:
你也可以使用 SSH 密鑰進行身份驗證,這比密碼更安全。
如果尚未生成,你可以在 Termux 中生成 SSH 密鑰對:
ssh-keygen
按照提示操作,通常可以直接按 Enter 使用默認值。公鑰會保存在 ~/.ssh/id_rsa.pub,私鑰在 ~/.ssh/id_rsa。
將你的公鑰複製到遠端服務器的 ~/.ssh/authorized_keys 文件中:
ssh-copy-id user@hostname_or_ip
或者手動複製:
cat ~/.ssh/id_rsa.pub | ssh user@hostname_or_ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
Termux 內置了一個 SSH 服務器。默認情況下,它在端口 8022 上運行。
要啟動 SSH 服務器,只需運行 sshd 命令:
sshd
:::warning 注意
每次 Termux 應用程式關閉或設備重啟後,你都需要重新運行 sshd 命令來啟動 SSH 服務器。
:::
如果你想使用密碼連接,你需要為你的 Termux 用戶設置一個密碼:
passwd
輸入並確認你的密碼。
現在,你可以從你的電腦或其他設備連接到 Termux SSH 服務器。你需要知道你的 Android 設備在局域網中的 IP 地址。
在你的電腦上:
ssh -p 8022 user@android_device_ip
其中 user 是你的 Termux 用戶名(通常是 u0_aXXX 這樣的字串,但對於 Termux SSH 服務器,你可以直接使用 sshd 運行時的用戶名,通常是 root 或者你當前的 shell 用戶)。
你可以在 Termux 中運行 whoami 命令來查看當前用戶名。
更可靠的方法是,當你啟動 sshd 後,它會使用當前的用戶身份。如果你沒有顯式設置用戶,它可以是 root (如果你以 root 權限運行) 或者默認的 Termux 用戶。
要停止 SSH 服務器,你可以找到 sshd 進程並終止它:
pkill sshd
Termux 提供了強大的 SSH 功能,無論是作為客戶端還是服務器,都能極大地增強你的 Android 設備的實用性。這使得在手機上進行開發、遠端管理或其他基於 SSH 的任務變得可能。
編輯設定檔需要系統管理員權限,請以系統管理員身份開啟終端機。
在終端機圖示上按右鍵,選擇「以系統管理員身份執行」。


執行以下命令:
notepad C:\ProgramData\ssh\sshd_config

- # PasswordAuthentication yes
+ PasswordAuthentication no

變更為

並儲存變更。
返回終端機,執行以下命令以重新啟動 SSH 伺服器:
Restart-Service sshd
測試設定是否已生效。
執行以下命令,若看到以下訊息:
ssh localhost
user@localhost: Permission denied (publickey,keyboaard-interactive).
即表示設定正確。
這篇備忘錄記錄了 SSH 隧道。
SSH 隧道(也稱為 SSH 端口轉發)是一種通過 SSH 連接在客戶端和服務器之間創建加密隧道的方法。它允許你將網絡流量從一個端口轉發到另一個端口,即使這些端口原本無法直接訪問。
SSH 隧道有三種類型:
用途:訪問防火牆後的遠端服務。
語法:
ssh -L [本地端口]:[目標主機]:[目標端口] [SSH用戶]@[SSH服務器]
範例:
假設你本地機器上的 8080 端口,通過 SSH 服務器(ssh.example.com)將流量轉發到遠端機器(remote.example.com)的 80 端口。
ssh -L 8080:remote.example.com:80 [email protected]
現在,你可以通過訪問本地的 localhost:8080 來訪問 remote.example.com 上的網頁服務。
用途:讓遠端機器訪問本地機器上的服務。
語法:
ssh -R [遠端端口]:[目標主機]:[目標端口] [SSH用戶]@[SSH服務器]
範例:
假設你希望遠端 SSH 服務器上的用戶可以通過 localhost:9000 訪問你本地機器上的 3000 端口(例如一個 Web 應用)。
ssh -R 9000:localhost:3000 [email protected]
現在,連接到 ssh.example.com 的用戶可以通過訪問 localhost:9000 來訪問你的本地服務。
用途:創建一個 SOCKS 代理,用於繞過防火牆或匿名上網。
語法:
ssh -D [本地端口] [SSH用戶]@[SSH服務器]
範例: 在本地機器上創建一個 SOCKS 代理,監聽 8181 端口。
ssh -D 8181 [email protected]
然後,你需要將你的瀏覽器或其他應用程式配置為使用 localhost:8181 作為 SOCKS 代理。所有通過這個代理的流量都將通過 ssh.example.com 加密隧道轉發。
如果你希望 SSH 隧道在後台保持運行,可以使用 -N(不執行遠端命令)和 -f(在後台運行)選項:
ssh -fN -L 8080:remote.example.com:80 [email protected]
SSH 隧道是一個非常強大且靈活的工具,它提供了安全地訪問網絡服務、繞過網絡限制以及增強隱私保護的方法。了解並熟練使用不同類型的端口轉發,可以大大提高你的網絡操作效率和安全性。