日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

ssh mysql转发_ssh转发代理:ssh-agent用法详解

發布時間:2025/3/21 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ssh mysql转发_ssh转发代理:ssh-agent用法详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用ssh-agent之前

使用ssh公鑰認證的方式可以免去ssh客戶端(如ssh命令、xshell等)連接遠端主機sshd時需要輸入對方用戶密碼的問題。

但如果執行ssh命令所在的主機上保存了多套秘鑰且將各公鑰分發給了不同的遠端主機,這時即使使用了公鑰認證,也依然需要輸入密碼,因為ssh客戶端不知道要讀取哪個私鑰去和該遠端主機上的公鑰配對。

看下面這張圖描述的情況:

上面描述的情形是這樣的:ssh客戶端要管理web server群,還要管理mysql server群,ssh客戶端要為這兩個群內的主機使用不同的密鑰對。例如要連接web server群內的主機,使用~/.ssh/id_rsa_1這一套秘鑰,連接mysql server群內的主機,使用~/.ssh/id_rsa_2這一套秘鑰。

于是,將id_rsa_1.pub分發給web server群內的每個主機,將id_rsa_2.pub分發給mysql server群內的每個主機:

$ ssh-copy-id -i ~/.ssh/id_rsa_1.pub root@webserver1

$ ssh-copy-id -i ~/.ssh/id_rsa_1.pub root@webserver2

$ ssh-copy-id -i ~/.ssh/id_rsa_1.pub root@webserver3

$ ssh-copy-id -i ~/.ssh/id_rsa_2.pub root@mysqlserver1

$ ssh-copy-id -i ~/.ssh/id_rsa_2.pub root@mysqlserver2

$ ssh-copy-id -i ~/.ssh/id_rsa_2.pub root@mysqlserver3

這一切進行的都很歡樂,但是一連接,發現還是要密碼:

$ ssh root@webserver1

快輸入 root@webserver's 密碼:???

$ ssh root@mysqlserver1

快輸入 root@mysqlserver's 密碼:???

這是因為ssh客戶端連接webserver1的時候,除了默認會讀取的規范私鑰文件id_rsa(或其它秘鑰類型)外,不會自動讀取任何一個文件,同理連接mysqlserver1也一樣。

正確的連接方式是指定連接時使用哪個私鑰去配對:

$ ssh -i ~/.ssh/id_rsa_1 root@webserver1

$ ssh -i ~/.ssh/id_rsa_2 root@mysqlserver1

好歡樂,終于連上了。但是真惡心,還要指定連接私鑰。

不僅如此,如果私鑰是加密(passphrase)的,指定私鑰的時候還得輸入這個passphrase密碼。😭

ssh-agent是干什么的

程序員很不滿意這樣的連接方式,于是創造了一個中間的私鑰管理者ssh-agent:你不是不知道怎么配對嗎,我幫你配。而且這個功能對于程序員來說,so easy。

我在ssh身份認證階段中解釋過,ssh認證的過程其實是客戶端(ssh命令端)讀取自己的私鑰并推導出指紋發送給服務端(sshd端),服務端也使用自己保存的公鑰推導出指紋進行對比,如果指紋相同說明服務端的公鑰和客戶端的私鑰是配對的。如下是公鑰、私鑰的指紋計算方式:

$ ssh-keygen -l -f ~/.ssh/id_rsa_2

2048 2c:e9:70:a8:f5:8d:87:9f:8c:de:cf:cf:14:f4:40:52 root@xuexi.longshuai.com (RSA)

$ ssh-keygen -l -f ~/.ssh/id_rsa_2.pub

2048 2c:e9:70:a8:f5:8d:87:9f:8c:de:cf:cf:14:f4:40:52 root@xuexi.longshuai.com (RSA)

這個密鑰身份認證的過程是理解ssh-agent的關鍵。

ssh-agent的主功能大概如下圖描述:

使用ssh-agent后,可以通過ssh-add命令向ssh-agent注冊本機的私鑰,ssh-agent會自動推導出這個私鑰的指紋(實際上是ssh-add計算的)保存在自己的小本本里(內存),以后只要ssh連接某主機(某用戶),將自動轉發給ssh-agent,ssh-agent將自動從它的小本本里查找私鑰的指紋并將其發送給服務端(sshd端)。如此一來,ssh客戶端就無需再指定使用哪個私鑰文件去連接。

總的看上去,ssh-agent的角色就是幫忙存儲、查找并發送對應的指紋而已,也就是說它是一個連接的轉發人,扮演的是一個代理的角色。

ssh并非一定支持ssh-agent轉發的連接。要使用ssh-agent的轉發功能,需要在sshd_config中開啟AllowAgentForwarding選項,在ssh_config中開啟ForwardAgent選項。

使用ssh-agent和ssh-add

先將ssh-agent運行起來:

$ ssh-agent

SSH_AUTH_SOCK=/tmp/ssh-GiORRAqMXEFt/agent.28161; export SSH_AUTH_SOCK;

SSH_AGENT_PID=28162; export SSH_AGENT_PID;

echo Agent pid 28162;

輸出結果中明確說明了導出了幾個環境變量,同時也可以知道ssh-agent使用Unix Domain套接字的方式監聽在本機上以及其pid為28162。到時候可以直接使用kill 28162殺掉這個進程,更直接的方式是使用ssh-agent -k,它會根據當前的環境變量SSH_AGENT_PID來殺進程。

但是很不幸,上面的ssh-agent盡管運行成功了,但是那兩個環境變量并沒有導出,上面的結果只是顯示給用戶看的。所以更多時候,會使用eval來執行ssh-agent,使得這些環境變量也被導出:

# 先殺掉剛才的ssh-agent

$ kill 28162

$ eval `ssh-agent`

Agent pid 28173

ssh客戶端上運行ssh-agent后,就可以使用ssh-add命令向ssh-agent添加私鑰(如果私鑰使用了passhprase密碼,則要求輸入一次密碼)。

$ ssh-add

$ ssh-add ~/.ssh/id_rsa_1

$ ssh-add ~/.ssh/id_rsa_2

默認會添加~/.ssh/下的所有私鑰類文件(~/.ssh/id_rsa, .ssh/id_dsa, ~/.ssh/id_ecdsa, ~/.ssh/id_ed25519, ~/.ssh/identity),也可以指定要添加的文件。正如上面給出的示例。

ssh-add命令是查找當前環境變量SSH_AUTH_SOCK的值并發送添加請求給對應套接字的,所以這個套接字環境變量非常重要。

之后再使用公鑰認證就可以直接連接到目標主機:

$ ssh root@webserver1

$ ssh root@webserver2

$ ssh root@webserver3

$ ssh root@mysqlserver1

$ ssh root@mysqlserver2

$ ssh root@mysqlserver3

ssh-agent的痛點和解決方案

ssh-agent的工作是依賴于環境變量SSH_AUTH_SOCK和SSH_AGENT_PID的,不同用戶,不同終端,只要沒有和這兩個環境變量配對的ssh-agent,這個agent進程就不可使用。要想使用某個agent,就必須在自己的shell中先設置好這兩個環境變量。

另外需要注意的是,以eval `ssh-agent`啟動的方式會直接讓ssh-agent工作在后臺,它自己會獨立成自己的進程組,其父進程或終端退出后它仍然會掛靠在pid=1的init/systemd下。而ssh-agent的工作是依賴于環境變量SSH_AUTH_SOCK和SSH_AGENT_PID的,shell或終端退出后這兩個環境變量就消失了,使得之前運行的ssh-agent被多余地保留在后臺。

其實,我們自己完全可以根據已有的ssh-agent推導出這兩個環境變量。如果ssh-agent進程還存在,那么在/tmp/目錄下一定有對應的套接字文件(除非啟動ssh-agent時自定義了套接字路徑)。

$ tree /tmp/ssh*

/tmp/ssh-q3tM0FzpCcdU

└── agent.28629

/tmp/ssh-SkKrrkK6qLDq

└── agent.28817

于是環境變量SSH_AUTH_SOCK的值已經得到了。再根據agent.中的ppid值,將其加上1,就是其子進程ssh-agent進程的PID值。例如,想要使用上面agent.28629對應的ssh-agent,那么設置:

export SSH_AUTH_SOCK=/tmp/ssh-q3tM0FzpCcdU/agent.28629

export SSH_AGENT_PID=28630

我們完全可以自己寫一個腳本來自動化獲取并設置這些環境變量。

下載好其中的ssh-find-agent.sh腳本,并放到某個目錄下。例如直接放在/etc/profile.d目錄下,然后給執行權限:

$ wget https://raw.githubusercontent.com/wwalker/ssh-find-agent/master/ssh-find-agent.sh -O /etc/profile.d/ssh-find-agent.sh

$ chmod +x /etc/profile.d/ssh-find-agent.sh

以后,只要在新的終端上,或者和ssh-agent進程失聯的shell中執行(如果在舊終端上,需要先source該shell腳本):

$ ssh-find-agent -a

它會自動尋找到第一個ssh-agent進程并配置好相關環境變量:

$ ssh-find-agent -a

$ echo $SSH_AUTH_SOCK

/tmp/ssh-SkKrrkK6qLDq/agent.28817

$ echo $SSH_AGENT_PID

28818

不給任何參數的ssh-find-agent函數會列出當前能找到的ssh-agent進程以及相關環境變量和編號。

$ ssh-find-agent

export SSH_AUTH_SOCK=/tmp/ssh-q3tM0FzpCcdU/agent.28629 #1)

export SSH_AUTH_SOCK=/tmp/ssh-SkKrrkK6qLDq/agent.28817 #2)

使用ssh-find-agent的-c選項可以手動選擇使用哪個ssh-agent進程。

如果不知道當前是否有ssh-agent,可以使用下面的方式:

$ ssh-find-agent -a || eval $(ssh-agent) > /dev/null

這樣就會在找不到的時候自動開啟一個ssh-agent。

除了上面的方法,還可以直接使用另一種管理工具:keychain。

$ yum install -y keychain

keychain能很好的管理ssh-agent,可以去查看下如何使用。

管理ssh-agent中的私鑰

ssh-agent命令的選項:

-a bind_address

指定ssh-agent運行時綁定的Unix Domain套接字路徑,默認是`$TMPDIR/ssh-xxx/agent.`

-c

-s

指定ssh-agent運行時輸出的內容(那些環境變量)是csh還是bash格式的語句

-d

調試模式

-k

殺掉`SSH_AGENT_PID`環境變量指定的pid進程

-t life

指定ssh-agent中私鑰(指紋)的有效期。默認單位為秒,可以指定m(分鐘)、h(小時)、d(天)、w(周)。如果不指定,則永久有效。該有效期可以被ssh-add指定的有效期選項覆蓋

ssh-add命令的選項(部分選項):

-D

刪除ssh-agent中所有私鑰(指紋)

-d key_file

刪除指定私鑰

-L

列出agent當前主機上所有公鑰參數,即公鑰文件中的內容

-l

列出agent當前已保存的指紋信息

-t

設置私鑰(指紋)的有效期。默認單位為秒,可以指定m(分鐘)、h(小時)、d(天)、w(周)

-x

使用一個密碼將agent鎖起來(lock),鎖起來的agent將不再提供任何服務

-X

解鎖agent

總結

以上是生活随笔為你收集整理的ssh mysql转发_ssh转发代理:ssh-agent用法详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。