SSH 那些你所知道和不知道的事

更多精彩文章https://deepzz.com
Desc:SSH 相關(guān)的使用技巧,用 .ssh/config 簡(jiǎn)化你的工作流程

SSH(Secure Shell)是什么?是一項(xiàng)創(chuàng)建在應(yīng)用層和傳輸層基礎(chǔ)上的安全協(xié)議,為計(jì)算機(jī)上的 Shell(殼層)提供安全的傳輸和使用環(huán)境。也是專為遠(yuǎn)程登錄會(huì)話和其他網(wǎng)絡(luò)服務(wù)提供安全性的協(xié)議。它能夠有效防止遠(yuǎn)程管理過程中的信息泄露問題。通過 SSH 可以對(duì)所有傳輸?shù)臄?shù)據(jù)進(jìn)行加密,也能夠防止 DNS 欺騙和 IP 欺騙。

具體生成 SSH Key 方式請(qǐng)參考:Github ssh key生成,免密登錄服務(wù)器方法。這里以 id_ecdsa(私鑰) 和 id_ecdsa.pub(公鑰) 為例。

本篇文章主要介紹 SSH 相關(guān)的使用技巧。通過對(duì) ~/.ssh/config 文件的配置你可以大大簡(jiǎn)化 SSH 相關(guān)的操作,如:

Host example                       # 關(guān)鍵詞
    HostName example.com           # 主機(jī)地址
    User root                      # 用戶名
    # IdentityFile ~/.ssh/id_ecdsa # 認(rèn)證文件
    # Port 22                      # 指定端口

通過執(zhí)行 $ ssh example 我就可以登錄我的服務(wù)器。而不需要敲更多的命令 $ ssh root@example.com。又如我們想要向服務(wù)器傳文件 $ scp a.txt example:/home/user_name。比以前方便多了。

更過相關(guān)幫助文檔請(qǐng)參考 $ man ssh_config 5。

配置文件

SSH 的配置文件有兩個(gè):

$ ~/.ssh/config            # 用戶配置文件
$ /etc/ssh/ssh_config      # 系統(tǒng)配置文件

下面來(lái)看看常用的配置參數(shù)。

Host
用于我們執(zhí)行 SSH 命令的時(shí)候如何匹配到該配置。

  • *,匹配所有主機(jī)名。
  • *.example.com,匹配以 .example.com 結(jié)尾。
  • !*.dialup.example.com,*.example.com,以 ! 開頭是排除的意思。
  • 192.168.0.?,匹配 192.168.0.[0-9] 的 IP。

AddKeysToAgent
是否自動(dòng)將 key 加入到 ssh-agent,值可以為
no(default)/confirm/ask/yes。

如果是 yes,key 和密碼都將讀取文件并以加入到 agent ,就像 ssh-add。其他分別是詢問、確認(rèn)、不加入的意思。添加到 ssh-agent 意味著將私鑰和密碼交給它管理,讓它來(lái)進(jìn)行身份認(rèn)證。

AddressFamily
指定連接的時(shí)候使用的地址族,值可以為 any(default)/inet(IPv4)/inet6(IPv6)。

BindAddress
指定連接的時(shí)候使用的本地主機(jī)地址,只在系統(tǒng)有多個(gè)地址的時(shí)候有用。在 UsePrivilegedPort 值為 yes 的時(shí)候無(wú)效。

ChallengeResponseAuthentication
是否響應(yīng)支持的身份驗(yàn)證 chanllenge,yes(default)/no。

Compression
是否壓縮,值可以為 no(default)/yes。

CompressionLevel
壓縮等級(jí),值可以為 1(fast)-9(slow)。6(default),相當(dāng)于 gzip。

ConnectionAttempts
退出前嘗試連接的次數(shù),值必須為整數(shù),1(default)。

ConnectTimeout
連接 SSH 服務(wù)器超時(shí)時(shí)間,單位 s,默認(rèn)系統(tǒng) TCP 超時(shí)時(shí)間。

ControlMaster
是否開啟單一網(wǎng)絡(luò)共享多個(gè) session,值可以為 no(default)/yes/ask/auto。需要和 ControlPath 配合使用,當(dāng)值為 yes 時(shí),ssh 會(huì)監(jiān)聽該路徑下的 control socket,多個(gè) session 會(huì)去連接該 socket,它們會(huì)盡可能的復(fù)用該網(wǎng)絡(luò)連接而不是重新建立新的。

ControlPath
指定 control socket 的路徑,值可以直接指定也可以用一下參數(shù)代替:

  • %L 本地主機(jī)名的第一個(gè)組件
  • %l 本地主機(jī)名(包括域名)
  • %h 遠(yuǎn)程主機(jī)名(命令行輸入)
  • %n 遠(yuǎn)程原始主機(jī)名
  • %p 遠(yuǎn)程主機(jī)端口
  • %r 遠(yuǎn)程登錄用戶名
  • %u 本地 ssh 正在使用的用戶名
  • %i 本地 ssh 正在使用 uid
  • %C 值為 %l%h%p%r 的 hash

請(qǐng)最大限度的保持 ControlPath 的唯一。至少包含 %h,%p,%r(或者 %C)。

ControlPersist
結(jié)合 ControlMaster 使用,指定連接打開后后臺(tái)保持的時(shí)間。值可以為 no/yes/整數(shù),單位 s。如果為 no,最初的客戶端關(guān)閉就關(guān)閉。如果 yes/0,無(wú)限期的,直到殺死或通過其它機(jī)制,如:ssh -O exit。

GatewayPorts
指定是否允許遠(yuǎn)程主機(jī)連接到本地轉(zhuǎn)發(fā)端口,值可以為 no(default)/yes。默認(rèn)情況,ssh 為本地回環(huán)地址綁定了端口轉(zhuǎn)發(fā)器。

HostName
真實(shí)的主機(jī)名,默認(rèn)值為命令行輸入的值(允許 IP)。你也可以使用 %h,它將自動(dòng)替換,只要替換后的地址是完整的就 ok。

IdentitiesOnly
指定 ssh 只能使用配置文件指定的 identity 和 certificate 文件或通過 ssh 命令行通過身份驗(yàn)證,即使 ssh-agent 或 PKCS11Provider 提供了多個(gè) identities。值可以為 no(default)/yes。

IdentityFile
指定讀取的認(rèn)證文件路徑,允許 DSA,ECDSA,Ed25519 或 RSA。值可以直接指定也可以用一下參數(shù)代替:

  • %d,本地用戶目錄 ~
  • %u,本地用戶
  • %l,本地主機(jī)名
  • %h,遠(yuǎn)程主機(jī)名
  • %r,遠(yuǎn)程用戶名

LocalCommand
指定在連接成功后,本地主機(jī)執(zhí)行的命令(單純的本地命令)。可使用 %d,%h,%l,%n,%p,%r,%u,%C 替換部分參數(shù)。只在 PermitLocalCommand 開啟的情況下有效。

LocalForward
指定本地主機(jī)的端口通過 ssh 轉(zhuǎn)發(fā)到指定遠(yuǎn)程主機(jī)。格式:LocalForward [bind_address:]post host:hostport,支持 IPv6。

PasswordAuthentication
是否使用密碼進(jìn)行身份驗(yàn)證,yes(default)/no。

PermitLocalCommand
是否允許指定 LocalCommand,值可以為 no(default)/yes。

Port
指定連接遠(yuǎn)程主機(jī)的哪個(gè)端口,22(default)。

ProxyCommand
指定連接的服務(wù)器需要執(zhí)行的命令。%h,%p,%r

如:ProxyCommand /usr/bin/nc -X connect -x 192.0.2.0:8080 %h %p

User
登錄用戶名

相關(guān)技巧

管理多組密鑰對(duì)

有時(shí)候你會(huì)針對(duì)多個(gè)服務(wù)器有不同的密鑰對(duì),每次通過指定 -i 參數(shù)也是非常的不方便。比如你使用 github 和 coding。那么你需要添加如下配置到 ~/.ssh/config

Host github
    HostName %h.com
    IdentityFile ~/.ssh/id_ecdsa_github
    User git
Host coding
    HostName git.coding.net
    IdentityFile ~/.ssh/id_rsa_coding
    User git

當(dāng)你克隆 coding 上的某個(gè)倉(cāng)庫(kù)時(shí):

# 原來(lái)
$ git clone git@git.coding.net:deepzz/test.git

# 現(xiàn)在
$ git clone coding:deepzz/test.git

vim 訪問遠(yuǎn)程文件

vim 可以直接編輯遠(yuǎn)程服務(wù)器上的文件:

$ vim scp://example/docker-compose.yml

遠(yuǎn)程服務(wù)當(dāng)本地用

通過 LocalForward 將本地端口上的數(shù)據(jù)流量通過 ssh 轉(zhuǎn)發(fā)到遠(yuǎn)程主機(jī)的指定端口。感覺你是使用的本地服務(wù),其實(shí)你使用的遠(yuǎn)程服務(wù)。如遠(yuǎn)程服務(wù)器上運(yùn)行著 Postgres,端口 5432(未暴露端口給外部)。那么,你可以:

Host db
    HostName db.example.com
    LocalForward 5433 localhost:5432

當(dāng)你連接遠(yuǎn)程主機(jī)時(shí),它會(huì)在本地打開一個(gè) 5433 端口,并將該端口的流量通過 ssh 轉(zhuǎn)發(fā)到遠(yuǎn)程服務(wù)器上的 5432 端口。

首先,建立連接:

$ ssh db

之后,就可以通過 Postgres 客戶端連接本地 5433 端口:

$ psql -h localhost -p 5433 orders

多連接共享

什么是多連接共享?在你打開多個(gè) shell 窗口時(shí)需要連接同一臺(tái)服務(wù)器,如果你不想每次都輸入用戶名,密碼,或是等待連接建立,那么你需要添加如下配置到 ~/.ssh/config

ControlMaster auto
ControlPath /tmp/%r@%h:%p

禁用密碼登錄

如果你對(duì)服務(wù)器安全要求很高,那么禁用密碼登錄是必須的。因?yàn)槭褂妹艽a登錄服務(wù)器容易受到暴力破解的攻擊,有一定的安全隱患。那么你需要編輯服務(wù)器的系統(tǒng)配置文件 /etc/ssh/sshd_config

PasswordAuthentication no
ChallengeResponseAuthentication no

關(guān)鍵詞登錄

為了更方便的登錄服務(wù)器,我們也可以省略用戶名和主機(jī)名,采用關(guān)鍵詞登錄。那么你需要添加如下配置到 ~/.ssh/config

Host deepzz                        # 別名
    HostName deepzz.com            # 主機(jī)地址
    User root                      # 用戶名
    # IdentityFile ~/.ssh/id_ecdsa # 認(rèn)證文件
    # Port 22                      # 指定端口

那么使用 $ ssh deepzz 就可以直接登錄服務(wù)器了。

代理登錄

有的時(shí)候你可能沒法直接登錄到某臺(tái)服務(wù)器,而需要使用一臺(tái)中間服務(wù)器進(jìn)行中轉(zhuǎn),如公司內(nèi)網(wǎng)服務(wù)器。首先確保你已經(jīng)為服務(wù)器配置了公鑰訪問,并開啟了agent forwarding,那么你需要添加如下配置到 ~/.ssh/config

Host gateway
    HostName proxy.example.com
    User root
Host db
    HostName db.internal.example.com                  # 目標(biāo)服務(wù)器地址
    User root                                         # 用戶名
    # IdentityFile ~/.ssh/id_ecdsa                    # 認(rèn)證文件
    ProxyCommand ssh gateway netcat -q 600 %h %p      # 代理命令

那么你現(xiàn)在可以使用 $ ssh db 連接了。

參考文檔

[1] https://www.freebsd.org/cgi/man.cgi?query=ssh_config

[2] https://zh.wikipedia.org/wiki/Secure_Shell

[3] http://wowubuntu.com/ssh-tips.html

最后編輯于
?著作權(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)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139
  • 名詞延伸 通俗的說,域名就相當(dāng)于一個(gè)家庭的門牌號(hào)碼,別人通過這個(gè)號(hào)碼可以很容易的找到你。如果把IP地址比作一間房子...
    楊大蝦閱讀 20,784評(píng)論 2 56
  • CA和證書安全協(xié)議(SSL/TLS)OpenSSH 一、CA和證書 (一) PKI(Public Key Infr...
    哈嘍別樣閱讀 1,518評(píng)論 0 0
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯(cuò)誤還是無(wú)法避免 以后資料會(huì)慢慢更新 大...
    數(shù)據(jù)革命閱讀 13,182評(píng)論 2 33
  • 王澤鑒 天龍八部 最高人民法院通過一項(xiàng)判決創(chuàng)設(shè)了一項(xiàng)法律原則,即權(quán)利在正當(dāng)期間內(nèi)消極行使,并有特殊事實(shí),足以使相對(duì)...
    best沙沙閱讀 238評(píng)論 0 0

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