(支持跳板機(jī))免密登錄服務(wù)器

程序員同學(xué)少不了天天登錄自己的開(kāi)發(fā)機(jī)逗物,但是開(kāi)發(fā)機(jī)都是需要密碼的方库,在漆黑的終端中輸入密碼并不是一個(gè)愉快的體驗(yàn)。

因?yàn)檩斎氲臅r(shí)候弯院,屏幕上并不會(huì)有任何的顯性的提示辱士,輸入多一位少一位或者輸入錯(cuò)誤都無(wú)法迅速發(fā)現(xiàn),只能在報(bào)錯(cuò)之后小心翼翼地重新輸入一遍听绳,這也導(dǎo)致我們根本不敢設(shè)置太過(guò)復(fù)雜的密碼颂碘,因?yàn)樘菀自诘卿洯h(huán)節(jié)卡住……

所以對(duì)我們來(lái)說(shuō),免密登錄就是一個(gè)神器辫红,至少能讓我們每天在登錄開(kāi)發(fā)機(jī)時(shí)不會(huì)因?yàn)槊艽a錯(cuò)誤而破壞心情凭涂。


歡迎大家關(guān)注我的個(gè)人博客【數(shù)洞】 【備用站】

一、ssh-key方案

先給大家演示一下效果:

# dain @ qixizhuangdeMac-Pro in ~ [21:46:50]
$ ssh tc
Last login: Fri Sep 28 23:32:50 2018 from 123.116.144.44

# root @ VM_0_16_centos in ~ [21:47:20]
$

可以看到贴妻,我們直接用一個(gè)簡(jiǎn)單的命令就登陸上了我們的服務(wù)器切油,這個(gè)過(guò)程里不需要輸入任何密碼。

那接下來(lái)我們來(lái)演示一遍如何配置名惩。首先澎胡,因?yàn)槲覀兊倪@臺(tái)本地機(jī)器已經(jīng)成功配置了自動(dòng)登錄,所以我們需要還原一下:

# root @ VM_0_16_centos in ~ [21:50:59]
$ cd .ssh    # 進(jìn)入$HOME下的.ssh目錄中娩鹉,這是ssh程序在每個(gè)用戶下的默認(rèn)配置目錄

# root @ VM_0_16_centos in ~/.ssh [21:51:01]
$ cat authorized_keys   # 查看本地機(jī)器授權(quán)的key
ssh-rsa AAAAB3...CSG0P dain@DataInsightsdeMacBook-Pro.local
ssh-rsa AAAA...fRDT51B dain@DataInsightsdeMac-Pro.local
# 此處因?yàn)樘L(zhǎng)攻谁,省略了大量字符

從末尾我們看出第二條記錄是當(dāng)前我們使用的設(shè)備,所以我們將第二條刪除并保存退出弯予。然后我們離開(kāi)服務(wù)器回到本地戚宦,同樣進(jìn)入.ssh目錄,查看一下現(xiàn)有的文件:

# root @ VM_0_16_centos in ~/.ssh [21:51:20]
$ exit
Connection to 132.232.117.41 closed.

# dain @ qixizhuangdeMac-Pro in ~ [21:57:10]
$ cd .ssh

# dain @ qixizhuangdeMac-Pro in ~/.ssh [21:57:22]
$ ll
total 32
-rw-r--r--  1 dain  staff   762B  9 28 23:26 config
-rw-------  1 dain  staff   1.6K  9 27 23:37 id_rsa
-rw-r--r--  1 dain  staff   412B  9 27 23:37 id_rsa.pub
-rw-r--r--  1 dain  staff   1.4K  9 28 23:32 known_hosts

我們配置自動(dòng)登錄需要的就是上邊列出的前三個(gè)文件锈嫩,其中第一個(gè)是本地配置文件受楼,第二、第三個(gè)文件用于服務(wù)器認(rèn)證本地機(jī)器呼寸,這兩個(gè)文件分別是RSA私鑰和公鑰艳汽。.ssh目錄下沒(méi)有上述文件的,可以通過(guò)如下命令生成:

# dain @ qixizhuangdeMac-Pro in ~/.ssh [22:01:31] C:130
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/dain/.ssh/id_rsa):
/Users/dain/.ssh/id_rsa already exists.
Overwrite (y/n)?

程序會(huì)詢問(wèn)一些選項(xiàng)对雪,直接Enter保持默認(rèn)即可『雍現(xiàn)在,我們已經(jīng)成功生成了RSA公鑰和私鑰瑟捣,接下來(lái)馋艺,我們就需要將公鑰傳遞給我們的服務(wù)器,即在服務(wù)器的$HOME/.ssh/authorized_keys文件中添加我們的id_rsa.pub中的內(nèi)容迈套。

# dain @ qixizhuangdeMac-Pro in ~/.ssh [22:07:30]
$ ssh-copy-id -i id_rsa.pub root@132.232.117.00
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@132.232.117.41's password:

Number of key(s) added:        1

Now try logging into the machine, with:   "ssh 'root@132.232.117.41'"
and check to make sure that only the key(s) you wanted were added.


# dain @ qixizhuangdeMac-Pro in ~/.ssh [22:07:46]
$

我們通過(guò)這一命令非痴筛疲快速地將我們的公鑰添加到了服務(wù)器上,這一過(guò)程里需要我們輸入服務(wù)器上對(duì)應(yīng)的密碼交汤。

好了雏赦,接下來(lái)我們配置本地的config文件:

# Private
Host bd
    HostName 180.xx.171.xxx
    User root
    Port 22

Host tc
    HostName 132.xxx.117.xx
    User root
    Port 22

其中,Host后邊填寫(xiě)一個(gè)自定義的服務(wù)器名稱芙扎,方便為主星岗,我把百度的服務(wù)器命名為bd,騰訊的服務(wù)器命名為tc戒洼。HostName這里需要配置服務(wù)器的地址俏橘,User后邊配置用戶名,Port一般保持默認(rèn)22即可圈浇。

這樣配置好之后寥掐,我們保存退出靴寂,測(cè)試一下:

# dain @ qixizhuangdeMac-Pro in ~/.ssh [22:14:24]
$ ssh tc
Last login: Sat Sep 29 22:07:10 2018 from 123.116.144.44

# root @ VM_0_16_centos in ~ [22:17:42]
$

OK,搞定召耘。

二百炬、使用expect命令腳本

事實(shí)上,我們還有一種選擇污它,通過(guò)自動(dòng)輸入密碼來(lái)登錄服務(wù)器剖踊,但是這種方法會(huì)導(dǎo)致服務(wù)器密碼明文出現(xiàn)在腳本中,不是特別安全衫贬。

#!/usr/bin/expect -f
spawn ssh ${YOUR_NAME}@${YOUR_HOST}
set timeout 30
match_max 100000
expect "*password*"
send -- "${YOUR_PASSWORD}\n"
expect "~]"
interact

這種方法不需要額外的配置德澈,通過(guò)匹配服務(wù)器的輸出來(lái)自動(dòng)進(jìn)行設(shè)定好的下一步輸入,這樣我們就用腳本模擬了密碼登錄的過(guò)程固惯。事實(shí)上梆造,在第一次登錄服務(wù)器的時(shí)候,一般會(huì)要求我們將服務(wù)器的公鑰添加到本地的.ssh/known_hosts文件中葬毫,這個(gè)過(guò)程我們需要輸入一個(gè)yes澳窑。上述腳本并沒(méi)有考慮這種情況,因此可能會(huì)報(bào)錯(cuò)退出供常。因此摊聋,假如需要考慮到我們從未登陸過(guò)一臺(tái)服務(wù)器的情況,我們可以使用如下腳本:

#!/usr/bin/expect -f
spawn ssh ${YOUR_NAME}@${YOUR_HOST}
set timeout 30
match_max 100000
expect {
    "(yes/no)?" {
        send "yes\n"
        expect "password:"
        send "${YOUR_PASSWORD}\n"
    }
    "password:" {
        send "${YOUR_PASSWORD}\n"
    }
 }

實(shí)際使用過(guò)程中栈暇,將${YOUR_PASSWORD}麻裁、${YOUR_NAME}等變量替換為實(shí)際情況,保存為腳本源祈,并賦予執(zhí)行權(quán)限煎源,移動(dòng)到系統(tǒng)變量目錄中即可。比如我喜歡將自己的工具腳本放入/usr/local/bin或者$HOME/bin目錄中香缺。

三手销、繞過(guò)跳板機(jī)自動(dòng)登錄

這一過(guò)程通過(guò)方法一、二都可以輕松實(shí)現(xiàn)图张。

1. 使用expect命令

針對(duì)第二種方法锋拖,無(wú)非就是將expect-send的過(guò)程增加一環(huán)即可:

#!/usr/bin/expect -f
spawn ssh ${YOUR_NAME}@${YOUR_HOST}
set timeout 30
match_max 100000
expect {
    "(yes/no)?" {
        send "yes\n"
        expect "password:"
        send "${YOUR_PASSWORD}\n"
        expect "~]"
        send "ssh ${YOUR_HOST_2}"
        expect {
            "(yes/no)?" {
                send "yes\n"
                expect "password:"
                send "${YOUR_PASSWD_2}"
            }
            "password:" {
                send "${YOUR_PASSWD_2}"
            }
        }
    }
    "password:" {
        send "${YOUR_PASSWORD}\n"
        expect "~]"
        send "ssh ${YOUR_HOST_2}"
        expect {
            "(yes/no)?" {
                send "yes\n"
                expect "password:"
                send "${YOUR_PASSWD_2}"
            }
            "password:" {
                send "${YOUR_PASSWD_2}"
            }
        }
    }
 }

就是這樣,沒(méi)有技術(shù)難度祸轮,只是單純的代碼重復(fù)兽埃。

2. 使用ssh-key

我更推薦這種方式,一個(gè)原因是方便快捷适袜,一個(gè)原因是不需要堆砌一堆垃圾代碼柄错。尤其是當(dāng)需要配置多個(gè)服務(wù)器自動(dòng)登錄的時(shí)候,這種方法明顯更為高效易用。

其實(shí)核心思路沒(méi)有變售貌,依然是將本地的公鑰添加到服務(wù)器的authorized_keys文件中给猾,只不過(guò)這次需要多次添加而已,接下來(lái)我描述一下這一過(guò)程:

首先颂跨,假設(shè)本地機(jī)器為機(jī)器A敢伸,跳板機(jī)為機(jī)器B,開(kāi)發(fā)機(jī)為機(jī)器C:

  1. 機(jī)器A上通過(guò)ssh-keygen -t rsa生成公鑰私鑰

  2. 機(jī)器A上通過(guò)ssh-copy-id -i .ssh/id_rsa.pub HOST_B機(jī)器A的公鑰添加到跳板機(jī)B毫捣。

  3. 機(jī)器Aid_rsaid_rsa.pub文件復(fù)制到機(jī)器B:scp -r .ssh/id_rsa* HOST_B:

  4. 登錄跳板機(jī)Bssh HOST_B

  5. 機(jī)器B上生成機(jī)器B的公鑰私鑰:ssh-keygen -t rsa

  6. 機(jī)器B上通過(guò)ssh-copy-id -i .ssh/id_rsa.pub HOST_C機(jī)器B的公鑰添加到機(jī)器C

  7. 機(jī)器B上通過(guò)ssh-copy-id -i id_rsa.pub HOST_C機(jī)器A的公鑰添加到機(jī)器C

  8. 截止現(xiàn)在帝际,機(jī)器B上有了機(jī)器A的公鑰蔓同,機(jī)器C上有了機(jī)器A機(jī)器B的公鑰蹲诀。事實(shí)上這一過(guò)程完全可以通過(guò)復(fù)制粘貼來(lái)完成斑粱,目標(biāo)文件是對(duì)應(yīng)機(jī)器上的.ssh/authorized_keys,使用追加新的一行的方式粘貼進(jìn)去即可脯爪。

  9. 我們還需要配置下本地機(jī)器A$HOME/.ssh/config文件则北。

下面是我的簡(jiǎn)略版的配置,其中痕慢,capital是我的跳板機(jī)的名稱尚揣,而fs、a0掖举、i1分別是我的三臺(tái)開(kāi)發(fā)機(jī)快骗,他們都需要通過(guò)跳板機(jī)來(lái)登錄。

需要注意的是塔次,我們使用ProxyCommand來(lái)配置我們?cè)L問(wèn)開(kāi)發(fā)機(jī)時(shí)自動(dòng)經(jīng)由跳板機(jī)來(lái)訪問(wèn)方篮。在實(shí)際使用過(guò)程中,你需要將capital替換為你自己命名的跳板機(jī)的名稱或HOST励负,其他HostName藕溅、User也替換為對(duì)應(yīng)的IP和用戶名即可。

# Work
Host capital
    HostName 101.xxx.220.xxx
    User qixizhuang
    Port 22

Host fs
    HostName 10.xx.142.xxx
    User qixizhuang
    Port 22
    ProxyCommand ssh -q -W %h:%p capital

Host a0
    HostName 10.xx.26.xxx
    User qixizhuang
    Port 22
    ProxyCommand ssh -q -W %h:%p capital

Host i1
    HostName 10.xxx.136.xxx
    User qixizhuang
    Port 22
    ProxyCommand ssh -q -W %h:%p capital

好了继榆,這樣大多數(shù)的登錄行為我們都可以免密完成了巾表。大家有問(wèn)題可以留言,我收到回及時(shí)回復(fù)略吨,大家一起探討攒发。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市晋南,隨后出現(xiàn)的幾起案子惠猿,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件偶妖,死亡現(xiàn)場(chǎng)離奇詭異姜凄,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)趾访,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)态秧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人扼鞋,你說(shuō)我怎么就攤上這事申鱼。” “怎么了云头?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵捐友,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我溃槐,道長(zhǎng)挚歧,這世上最難降的妖魔是什么蚊丐? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上瘟斜,老公的妹妹穿的比我還像新娘简僧。我一直安慰自己澄惊,他們只是感情好紊馏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著姻几,像睡著了一般匣缘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鲜棠,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天肌厨,我揣著相機(jī)與錄音,去河邊找鬼豁陆。 笑死柑爸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的盒音。 我是一名探鬼主播表鳍,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼祥诽!你這毒婦竟也來(lái)了譬圣?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤雄坪,失蹤者是張志新(化名)和其女友劉穎厘熟,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绳姨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年登澜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片飘庄。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡脑蠕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出跪削,到底是詐尸還是另有隱情谴仙,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布碾盐,位于F島的核電站晃跺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏廓旬。R本人自食惡果不足惜哼审,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一谐腰、第九天 我趴在偏房一處隱蔽的房頂上張望孕豹。 院中可真熱鬧,春花似錦十气、人聲如沸励背。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)叶眉。三九已至,卻和暖如春芹枷,著一層夾襖步出監(jiān)牢的瞬間衅疙,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工鸳慈, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留饱溢,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓走芋,卻偏偏與公主長(zhǎng)得像绩郎,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子翁逞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355