SSH 登錄配置與文件傳輸

SSH 是常用的遠(yuǎn)程登錄協(xié)議/工具。無論是管理遠(yuǎn)程主機(jī),混 GitHub,上BBS,還是折騰自家的路由器,都離不開 SSH。相比于 Telnet,SSH 可以更安全,也可以更方便。之所以說“可以”,是因?yàn)?,想要安全而方便地使?SSH,還是需要一些知識(shí)的。

約定

先做一個(gè)約定。

本文討論的 SSH,是指 SSH 客戶端而不是服務(wù)端。SSH 客戶端軟件,是 Linux/Mac 的命令行界面下的 ssh 命令,PuTTY 之類的圖形界面客戶端,原理相同,會(huì)在文末作簡(jiǎn)略介紹。

我們還約定,除了當(dāng)前運(yùn)行 SSH 客戶端的本地主機(jī)(以下簡(jiǎn)稱“本地主機(jī)”)外,還有兩臺(tái)遠(yuǎn)程主機(jī),分別是:

  • 遠(yuǎn)程主機(jī) remote, IP 地址12.34.56.78,SSH 端口52193,用戶名admin,密碼admin
  • 家庭路由器 router,地址 router.asus.com,SSH 端口22,用戶名admin,密碼admin

基本連接

如果想從本地主機(jī)遠(yuǎn)程登錄 remote,最基本的辦法是使用如下命令:

ssh admin@12.34.56.78 -p 52193

然后根據(jù)提示,輸入密碼,完成登錄。

登錄 router 稍簡(jiǎn)單。因?yàn)?router 的 SSH 服務(wù)使用了默認(rèn)端口,所以無需手動(dòng)指定。

ssh admin@router.asus.com

可惜許多 VPS 的 SSH 服務(wù)往往監(jiān)聽的都是個(gè)挺難記的端口,記憶負(fù)擔(dān)較重。登錄時(shí)還要輸入密碼,一次兩次還好,需要頻繁登錄的時(shí)候也挺煩人。

歧途

到這里,有人就會(huì)想些簡(jiǎn)化登錄的辦法了。比如:

  1. 寫個(gè)自動(dòng)登錄腳本,把地址端口用戶名密碼全都明文預(yù)先寫在腳本里。這種方法需要一定的編程基礎(chǔ),費(fèi)時(shí)費(fèi)力,還有密碼泄露風(fēng)險(xiǎn),可謂事倍功半。
  2. 換個(gè)支持自動(dòng)登錄的圖形界面客戶端,比如 SecureCRT 或者“修改版”的 PuTTY。只是 SecureCRT 是要收費(fèi)的,Linux/Mac 平臺(tái)上沒有,“修改版”的 PuTTY 天曉得他還修改了些什么,而且無論怎樣,密碼都要明文存儲(chǔ),并不安全。

更有甚者,我還見過某硬件論壇里有人(還是版主)教別人放著 SSH 不用,給路由器開 Telnet 服務(wù),然后寫了個(gè) vbs 腳本玩自動(dòng)登錄的。結(jié)果安全性、便利性一樣不沾,自找麻煩,真是以其昏昏使人昭昭。

Key

其實(shí),SSH 協(xié)議本身就支持無密碼登錄,甚至無密碼登錄比密碼登錄的安全性還高,這就是基于秘鑰的安全驗(yàn)證。

ssh-keygen -t rsa -b 4096 -C "your comment"

以上命令可以在本地主機(jī)的 ~/.ssh/ 目錄下生成一對(duì) RSA 鑰匙,id_rsa 是私鑰,id_rsa.pub 是公鑰。私鑰必須保密而公鑰可以公開。把公鑰添加到遠(yuǎn)程主機(jī)的 ~admin/.ssh/authorized_keys 中,就可以實(shí)現(xiàn)無密碼登錄。

生成鑰匙對(duì)的過程中,會(huì)提示設(shè)置 passphrase。passphrase 可以留空,但是一旦私鑰泄露,黑客就可以利用你的私鑰任意登錄,存在安全隱患;不留空的話,每次登錄還是要像輸入密碼一樣輸入 passphrase。將私鑰納入 ssh-agent 管理可以解決上述問題。ssh-agent 的用法,詳見《使用SSH Agent Forwarding》。如果你使用 Mac,蘋果的鑰匙串會(huì)自動(dòng)幫你管理 passphrase。

需要注意的是,秘鑰文件乃至整個(gè) .ssh 目錄(無論是本地主機(jī)還是遠(yuǎn)程主機(jī)),都有嚴(yán)格的權(quán)限限制,如果權(quán)限不正確,連接會(huì)被拒絕。什么樣的權(quán)限限制呢?除了文件所有者外,其他用戶不得修改(增加、刪除、重命名).ssh 目錄下的文件,不得閱讀私鑰的內(nèi)容。這也很好理解,如果其他用戶有了 .ssh 目錄的寫權(quán)限,就可以把遠(yuǎn)程主機(jī)上的 authorized_keys 隨意替換成自己生成的公鑰;如果其他用戶可以閱讀私鑰,那私鑰的保密性就蕩然無存。所以,使用 SSH 連接之前,應(yīng)該在遠(yuǎn)程和本地主機(jī)上執(zhí)行以下命令:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa

config 文件

以上,我們解決了輸入密碼的問題。但是,登錄時(shí)仍然要輸入一長(zhǎng)串用戶名、地址、端口,不光是輸入負(fù)擔(dān),也是記憶負(fù)擔(dān)?,F(xiàn)在,我們使用 config 文件進(jìn)一步簡(jiǎn)化登錄。

在本地主機(jī)的 ~/.ssh 目錄下新建 config 文件,內(nèi)容如下:

Host remote
    HostName 12.34.56.78
    User admin
    Port 52193

各項(xiàng)配置顧名思義,很好理解?,F(xiàn)在,登錄 remote 的命令簡(jiǎn)化為:

ssh remote

沒有冗長(zhǎng)的地址,沒有難記的端口,也無需輸入密碼。

router 也可以如法炮制??墒侨绻?router 的連接使用了和 remote 不同的秘鑰對(duì)呢?那就需要手動(dòng)指定私鑰文件了。

Host router
    HostName router.asus.com
    User admin
    IdentifyFile ~/.ssh/router.pem

/etc 目錄下有一份 ssh_config 文件,功能與用戶家目錄下的 config 目錄相同,但 /etc 下那個(gè)是全局的配置文件,如果二者不一致,家目錄下的配置會(huì)覆蓋全局配置。由于每個(gè)用戶有不同的需求,因此不建議直接修改 ssh_config。不過,倒是可以學(xué)習(xí)一下其中的配置選項(xiàng)。

scp 和 sftp

ssh、scpsftp 都是 OpenSSH 軟件包的組成部分。其中,scp 即 secure copy,是用來在本地和遠(yuǎn)程主機(jī)間復(fù)制文件的工具,可以看做是增強(qiáng)加密版的 cp,只不過 cp 是在本地文件系統(tǒng)中相互復(fù)制,scp 可以操作遠(yuǎn)程主機(jī)的文件系統(tǒng),cp 只需要本地路徑來定位文件,scp 還需要加上遠(yuǎn)程主機(jī)名;sftp 是 SSH 封裝加密過的 ftp 工具。

換作以前,從遠(yuǎn)程主機(jī) remote 向本地復(fù)制一份文件,需要這樣:

scp -P 52193 admin@12.34.56.78:~/filename.txt ~/

然后輸入密碼,開始傳輸。

由于 scpssh 使用同一套配置,經(jīng)過上面一番配置后,命令直接簡(jiǎn)化為:

scp remote:~/filename.txt ~/

是不是簡(jiǎn)單了很多?

PuTTY 和 WinSCP

圖形化的 SSH 客戶端有很多,免費(fèi)的 PuTTY 是常用的一個(gè)。順便提一句,下載 PuTTY 請(qǐng)去官網(wǎng),最好不要去什么“軟件中心”、“下載中心”下載來歷不明的版本,非要下載,也請(qǐng)驗(yàn)證簽名后再使用;也不要去下載什么漢化版、修改版,PuTTY 的漢化版曾經(jīng)爆出過后門。

PuTTY 是不支持自動(dòng)輸入密碼的。想要實(shí)現(xiàn)自動(dòng)登錄,唯一的正途就是秘鑰登錄:用 PuTTYgen 生成一對(duì)秘鑰,Public Key(公鑰)復(fù)制添加到遠(yuǎn)程主機(jī)的 authorized_keys 文件中,Private Key(私鑰)導(dǎo)出妥善保管在本地。所謂妥善保管,是指保存在用戶主目錄 %HOMEPATH% 下的某個(gè)位置——如果隨意放在 C 盤、D 盤的某個(gè)位置,其他用戶很容易就看到私鑰內(nèi)容了,安全性何在?

然后,在 PuTTY 配置界面的 Connection -> SSH -> Auth 找到 Privaet key file for authentication,填入私鑰位置,保存即可。

WinSCP 是圖形化的 scp 工具,配置原理與 PuTTY 類似,就不加贅述了。


SSH 提供了安全的遠(yuǎn)程登錄方式,稍加學(xué)習(xí)配置,可以讓登錄過程更加便捷。不要試圖用歪門邪道的方式來獲得便利性,也不要為了便利性而忽視安全性。重視安全可能并不會(huì)帶來直接的利益,但忽視它,往往會(huì)造成巨大的損失。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容