Linux 遠程連接之 SSH 新手指南
使用 Linux,你只需要在鍵盤上輸入命令,就可以巧妙地使用計算機(甚至這台計算機可以在世界上任何地方),這正是 Linux 最吸引人的特性之一。有了 OpenSSH,POSIX 用戶就可以在有許可權連接的計算機上打開安全外殼協議,然後遠程使用。這對於許多 Linux 用戶來說可能不過是日常任務,但從沒操作過的人可能就會感到很困惑。本文介紹了如何配置兩台計算機的 安全外殼協議 (簡稱 SSH)連接,以及如何在沒有密碼的情況下安全地從一台計算機連接到另一台計算機。
相關術語
在討論多台計算機時,如何將不同計算機彼此區分開可能會讓人頭疼。IT 社區擁有完善的術語來描述計算機聯網的過程。
- 服務 : 服務是指在後台運行的軟體,因此它不會局限於僅供安裝它的計算機使用。例如,Web 伺服器通常託管著 Web 共享 服務。該術語暗含(但非絕對)它是沒有圖形界面的軟體。
- 主機 : 主機可以是任何計算機。在 IT 中,任何計算機都可以稱為 主機,因為從技術上講,任何計算機都可以 託管 對其他計算機有用的應用程序。你可能不會把自己的筆記本電腦視為 主機,但其實上面可能正運行著一些對你、你的手機或其他計算機有用的服務。
- 本地 : 本地計算機是指用戶或某些特定軟體正在使用的計算機。例如,每台計算機都會把自己稱為
localhost
。 - 遠程 : 遠程計算機是指你既沒在其面前,也沒有在實際使用的計算機,是真正意義上在 遠程 位置的計算機。
現在術語已經明確好,我們可以開始了。
在每台主機上激活 SSH
要通過 SSH 連接兩台計算機,每個主機都必須安裝 SSH。SSH 有兩個組成部分:本地計算機上使用的用於啟動連接的命令,以及用於接收連接請求的 伺服器。有些計算機可能已經安裝好了 SSH 的一個或兩個部分。驗證 SSH 是否完全安裝的命令因系統而異,因此最簡單的驗證方法是查閱相關配置文件:
$ file /etc/ssh/ssh_config
/etc/ssh/ssh_config: ASCII text
如果返回 No such file or directory
錯誤,說明沒有安裝 SSH 命令。
SSH 服務的檢測與此類似(注意文件名中的 d
):
$ file /etc/ssh/sshd_config
/etc/ssh/sshd_config: ASCII text
根據缺失情況選擇安裝兩個組件:
$ sudo dnf install openssh-clients openssh-server
在遠程計算機上,使用 systemd 命令啟用 SSH 服務:
$ sudo systemctl enable --now sshd
你也可以在 GNOME 上的 系統設置 或 macOS 上的 系統首選項 中啟用 SSH 服務。在 GNOME 桌面上,該設置位於 共享 面板中:
![在 GNOME 系統設置中激活 SSH](/data/attachment/album/202108/28/105418yn1ejybuv4jv6q8p.png "Activate SSH in GNOME System Settings")
開啟安全外殼協議
現在你已經在遠程計算機上安裝並啟用了 SSH,可以嘗試使用密碼登錄作為測試。要訪問遠程計算機,你需要有用戶帳戶和密碼。
遠程用戶不必與本地用戶相同。只要擁有相應用戶的密碼,你就可以在遠程機器上以任何用戶的身份登錄。例如,我在我的工作計算機上的用戶是 sethkenlon
,但在我的個人計算機上是 seth
。如果我正在使用我的個人計算機(即作為當前的本地計算機),並且想通過 SSH 連接到我的工作計算機,我可以通過將自己標識為 sethkenlon
並使用我的工作密碼來實現連接。
要通過 SSH 連接到遠程計算機,你必須知道其 IP 地址或可解析的主機名。在遠程計算機上使用 ip
命令可以查看該機器的 IP 地址:
$ ip addr show | grep "inet "
inet 127.0.0.1/8 scope host lo
inet 10.1.1.5/27 brd 10.1.1.31 [...]
如果遠程計算機沒有 ip
命令,可以嘗試使用 ifconfig
命令(甚至可以試試 Windows 上通用的 ipconfig
命令)。
127.0.0.1
是一個特殊的地址,它實際上是 localhost
的地址。這是一個 環回 地址,系統使用它來找到自己。這在登錄遠程計算機時並沒有什麼用,因此在此示例中,遠程計算機的正確 IP 地址為 10.1.1.5
。在現實生活中,我的本地網路正在使用 10.1.1.0
子網,進而可得知前述正確的 IP 地址。如果遠程計算機在不同的網路上,那麼 IP 地址幾乎可能是任何地址(但絕不會是 127.0.0.1
),並且可能需要一些特殊的路由才能通過各種防火牆到達遠程。如果你的遠程計算機在同一個網路上,但想要訪問比自己的網路更遠的計算機,請閱讀我之前寫的關於 在防火牆中打開埠 的文章。
如果你能通過 IP 地址 或 主機名 ping
到遠程機器,並且擁有登錄帳戶,那麼就可以通過 SSH 接入遠程機器:
$ ping -c1 10.1.1.5
PING 10.1.1.5 (10.1.1.5) 56(84) bytes of data.
64 bytes from 10.1.1.5: icmp_seq=1 ttl=64 time=4.66 ms
$ ping -c1 akiton.local
PING 10.1.1.5 (10.1.1.5) 56(84) bytes of data.
至此就成功了一小步。再試試使用 SSH 登錄:
$ whoami
seth
$ ssh sethkenlon@10.1.1.5
bash$ whoami
sethkenlon
測試登錄有效,下一節會介紹如何激活無密碼登錄。
創建 SSH 密鑰
要在沒有密碼的情況下安全地登錄到另一台計算機,登錄者必須擁有 SSH 密鑰。可能你的機器上已經有一個 SSH 密鑰,但再多創建一個新密鑰也沒有什麼壞處。SSH 密鑰的生命周期是在本地計算機上開始的,它由兩部分組成:一個是永遠不會與任何人或任何東西共享的私鑰,一個是可以複製到任何你想要無密碼訪問的遠程機器上的公鑰。
有的人可能會創建一個 SSH 密鑰,並將其用於從遠程登錄到 GitLab 身份驗證的所有操作,但我會選擇對不同的任務組使用不同的密鑰。例如,我在家裡使用一個密鑰對本地機器進行身份驗證,使用另一個密鑰對我維護的 Web 伺服器進行身份驗證,再一個單獨的密鑰用於 Git 主機,以及又一個用於我託管的 Git 存儲庫,等等。在此示例中,我將只創建一個唯一密鑰,以在區域網內的計算機上使用。
使用 ssh-keygen
命令創建新的 SSH 密鑰:
$ ssh-keygen -t ed25519 -f ~/.ssh/lan
-t
選項代表 類型 ,上述代碼設置了一個高於默認值的密鑰加密級別。-f
選項代表 文件,指定了密鑰的文件名和位置。運行此命令後會生成一個名為 lan
的 SSH 私鑰和一個名為 lan.pub
的 SSH 公鑰。
使用 ssh-copy-id
命令把公鑰發送到遠程機器上,在此之前要先確保具有遠程計算機的 SSH 訪問許可權。如果你無法使用密碼登錄遠程主機,也就無法設置無密碼登錄:
$ ssh-copy-id -i ~/.ssh/lan.pub sethkenlon@10.1.1.5
過程中系統會提示你輸入遠程主機上的登錄密碼。
操作成功後,使用 -i
選項將 SSH 命令指向對應的密鑰(在本例中為 lan
)再次嘗試登錄:
$ ssh -i ~/.ssh/lan sethkenlon@10.1.1.5
bash$ whoami
sethkenlon
對區域網上的所有計算機重複此過程,你就將能夠無密碼訪問這個區域網上的每台主機。實際上,一旦你設置了無密碼認證,你就可以編輯 /etc/ssh/sshd_config
文件來禁止密碼認證。這有助於防止其他人使用 SSH 對計算機進行身份驗證,除非他們擁有你的私鑰。要想達到這個效果,可以在有 sudo
許可權的文本編輯器中打開 /etc/ssh/sshd_config
並搜索字元串 PasswordAuthentication
,將默認行更改為:
PasswordAuthentication no
保存並重啟 SSH 伺服器:
$ sudo systemctl restart sshd && echo "OK"
OK
$
日常使用 SSH
OpenSSH 改變了人們對操作計算機的看法,使用戶不再被束縛在面前的計算機上。使用 SSH,你可以訪問家中的任何計算機,或者擁有帳戶的伺服器,甚至是移動和物聯網設備。充分利用 SSH 也意味著解鎖 Linux 終端的更多用途。如果你還沒有使用過 SSH,請試一下它吧。試著適應 SSH,創建一些適當的密鑰,以此更安全地使用計算機,打破必須與計算機面對面的局限性。
via: https://opensource.com/article/20/9/ssh
作者:Seth Kenlon 選題:lujun9972 譯者:unigeorge 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive