程序員同學(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:
在機(jī)器A上通過(guò)
ssh-keygen -t rsa
生成公鑰私鑰在機(jī)器A上通過(guò)
ssh-copy-id -i .ssh/id_rsa.pub HOST_B
將機(jī)器A的公鑰添加到跳板機(jī)B毫捣。將機(jī)器A的
id_rsa
和id_rsa.pub
文件復(fù)制到機(jī)器B:scp -r .ssh/id_rsa* HOST_B:
登錄跳板機(jī)B:
ssh HOST_B
在機(jī)器B上生成機(jī)器B的公鑰私鑰:
ssh-keygen -t rsa
在機(jī)器B上通過(guò)
ssh-copy-id -i .ssh/id_rsa.pub HOST_C
將機(jī)器B的公鑰添加到機(jī)器C。在機(jī)器B上通過(guò)
ssh-copy-id -i id_rsa.pub HOST_C
將機(jī)器A的公鑰添加到機(jī)器C截止現(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)去即可脯爪。我們還需要配置下本地機(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ù)略吨,大家一起探討攒发。