如何從 Windows 上用 SSH 連接到 Linux
在 Linux 世界中, 安全外殼 (SSH)協議是最為常用的、通過命令行控制遠程計算機的方式。SSH 是真正的 Linux 原創,但是它在 Windows 世界中也越來越流行。甚至有了一份官方的 Windows 的 SSH 文檔,那篇文檔闡述了使用 OpenSSH 控制 Windows 的方法。
這篇文章展示了如何使用了流行的開源工具 PuTTY,建立一個從 Windows 到 Fedora 33 Linux 系統的 SSH 連接。
使用 SSH 的方法
SSH 使用客戶端-伺服器模式,即 SSH 客戶端會創建到 SSH 服務端的連接。SSH 伺服器通常會作為 守護進程 運行,所以它常被稱為 SSHD。你很難找到一個不自帶 SSH 守護進程的 Linux 發行版。在 Fedora 33 中,已安裝了 SSH 守護進程,但是並未激活。
你可以使用 SSH 控制幾乎所有的 Linux 機器,無論它是作為虛擬機還是作為網路上的物理設備運行。一個常見的用例是 無頭 配置的嵌入式設備,如樹莓派。SSH 也可以用做一個其它網路服務的隧道。因為 SSH 連接是加密的,所以你可以使用 SSH 作為一個任何默認不提供加密的協議的傳輸層。
在這篇文章中,我將解釋使用 SSH 的四個方式:1、如何在 Linux 端配置 SSH 守護進程;2、如何設置遠程控制台連接;3、如何通過網路複製文件,4. 如何將 SSH 作為某些協議的隧道。
1、配置 SSHD
將 Linux 系統(文中是 Fedora 33)作為 SSH 伺服器,允許 PuTTY SSH 客戶端進行連接。首先,檢查守護進程的 SSH 配置。配置文件放在 /etc/ssh/sshd_config
,它包含了許多選項,通過取消掉相關行的注釋就可以激活:
# $OpenBSD: sshd_config,v 1.100 2016/08/15 12:32:04 naddy Exp $
# This is the sshd server system-wide configuration file. See
# sshd_config(5) for more information.
# This sshd was compiled with PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin
# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented. Uncommented options override the
# default value.
Include /etc/ssh/sshd_config.d/*.conf
#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
沒有取消任何注釋的默認配置在這個示例中應該是可以工作的。要檢查 SSH 守護進程是否已經運行,輸入 systemctl status sshd
:
$ systemctl status sshd
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2018-06-22 11:12:05 UTC; 2 years 11 months ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 577 (sshd)
Tasks: 1 (limit: 26213)
CGroup: /system.slice/sshd.service
└─577 /usr/sbin/sshd -D -oCiphers=[aes256-gcm@openssh.com][5],chacha20-[...]
如果它處於 未激活 狀態,使用 systemctl start sshd
命令啟動它。
2、設置遠程控制台
在 Windows 下 下載 PuTTY 安裝程序,然後安裝並打開它。你應看到一個像這樣的窗口:
![PuTTY configuration screen](/data/attachment/album/202207/23/110048szd6dh4pfhdd7zmm.png "PuTTY configuration screen")
在「 主機名(或 IP 地址) 」輸入框,鍵入你的 Linux 系統的連接信息。本文設置了一個 Fedora 33 虛擬機,它使用橋接網路適配器,使我可以由 IP 地址 192.168.1.60
連接這個系統。點擊「 打開 」,應會如圖示的打開一個窗口:
![PutTTY security alert](/data/attachment/album/202207/23/110048gnyjeahjzynsspe5.png "PutTTY security alert")
這是 SSH 的安全措施之一,是為了防止 中間人攻擊 。消息中的指紋應該匹配 Linux 系統中放在 /etc/ssh/ssh_host_ed25519_key.pub
的密鑰。PuTTY 將這個密鑰以 MD5 哈希值 的方式列印出來。要檢查它的真實性,切換到 Linux 系統並打開一個控制台,然後輸入:
ssh-keygen -l -E md5 -f /etc/ssh/ssh_host_ed25519_key.pub
輸出應該和 PuTTY 展示的指紋一致:
$ ssh-keygen -l -E md5 -f /etc/ssh/ssh_host_ed25519_key.pub
256 MD5:E4:5F:01:05:D0:F7:DC:A6:32 no comment (ED25519)
點擊「 是 」以確認 PuTTY 的安全提示。主機系統的指紋現在存儲在 PuTTY 的信任列表中,其位於 Windows 的註冊表中的:
HKEY_CURRENT_USERSOFTWARESimonTathamPuTTYSshHostKeys
輸入正確的登錄憑證,然後你應該進入控制台了,位置在你的用戶主目錄。
![Logged in to SSH](/data/attachment/album/202207/23/110049q1v4tgcov47dvoob.png "Logged in to SSH")
3、通過網路複製文件
除了遠程控制台,你同樣可以使用 PuTTY 通過 SSH 來傳輸文件。PuTTY 的安裝目錄在 C:Program Files (x86)PuTTY
,在該目錄下尋找 ppscp.exe
。你既可以使用它從 Linux 系統複製文件,也可以複製文件到 Linux 系統。
使用 Windows + R
然後輸入 cmd
來打開命令提示符,從你的 Linux 用戶主目錄複製 MYFile.txt
到你的 Windows 主目錄,輸入:
C:"Program Files (x86)"PuTTYpscp.exe stephan@192.168.1.60:/home/stephan/MyFile.txt .
要從 Windows 主目錄複製文件到 Linux 用戶主目錄,輸入:
C:"Program Files (x86)"PuTTYpscp.exe MyFile.txt stephan@192.168.1.60:/home/stephan/
就像你也許已經發現的那樣,複製的命令通常構造為:
pscp.exe <source> <target>
4、隧道化一個協議
假設你擁有一個 Linux 機器,為某些特別的應用運行一個基於 HTTP 的服務。你想從你的 Windows 機器通過互聯網訪問這個 HTTP 服務。而且,你不能將相關的 TCP 埠暴露在公網,因為:
- 這個服務通過 HTTP 而非 HTTPS 運行
- 根本沒有用戶管理和登錄系統
乍一看,建立這種架構不產生可怕的漏洞似乎是不可能的。但是 SSH 可簡單的為這種情況建立一個安全的解決方案。
我將用我的軟體項目 Pythonic 來演示這個過程。在容器中運行。Pythonic 作為容器運行,開放兩個 TCP 埠:TCP 埠 7000(主要編輯器)和 TCP 埠 8000(code-server 代碼編輯器)。
要在一個 Linux 機器上安裝 Pythonic ,運行:
podman pull pythonicautomation/pythonic
podman run -d -p 7000:7000 -p 8000:8000 pythonic
轉向你的 Windows 機器,打開 PuTTy,轉到 「 連接 -> SSH -> 隧道 」。加入你要轉發的兩個 TCP 埠:
- 源:
7000
/ 目標:localhost:7000
- 源:
8000
/ 目標:localhost:8000
![Port forwarding in PuTTY](/data/attachment/album/202207/23/110049jm4rapms266sc7z6.png "Port forwarding in PuTTY")
然後返回 「 會話 」 部分,並像之前那樣建立一個 SSH 鏈接。打開網頁瀏覽器,然後轉到 http://localhost:7000
;你應該看見像這樣的窗口:
![Pythonic](/data/attachment/album/202207/23/110049jhw6cd6mbk67dgwk.png "Pythonic")
你成功的設置了埠轉發!
警告: 如果你選擇在公網上暴露 TCP 埠 22 ,不要使用易於猜測的登錄憑證。你將接受來自全世界的登錄請求,它們使用常見的、標準的登錄憑證以嘗試登錄你的 Linux 機器。相反,只允許已知的用戶登錄。這種登錄限制可以通過 公鑰加密 來實現,它使用一個密鑰對,其中公鑰存儲在 SSH 主機上,而私鑰保留在客戶端。
調試
如果你難以連接你的 Linux 機器,你可以跟蹤你的 SSH 守護進程的處理過程:
journalctl -f -u sshd
這是一個普通的登錄進程,但是其日誌級別為 DEBUG,它看起來是這樣的 :
![LogLevel DEBUG output](/data/attachment/album/202207/23/110050lizdhug1zr2ghaz1.png "LogLevel DEBUG output")
了解更多
這篇文章幾乎沒有涉及到使用 SSH 的方法。如果你正在尋找一個特定用例的信息,你也許可以在互聯網中找到無數的教程。我在工作中使用 PuTTY ,因為它易於設置,在兩個操作系統間又具有良好的可操作性,使得它成為連接解決方案里的瑞士軍刀。
(文內圖片來自:Stephan Avenwedde,CC BY-SA 4.0)
via: https://opensource.com/article/21/6/ssh-windows
作者:Stephan Avenwedde 選題:lujun9972 譯者:yjacks 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive