半年前寫的腳本蜈彼,等有時(shí)間就加注釋(滑稽)
前言
腳本無非就是寫給電腦的記事本认烁,記事本上告訴電腦你要干什么(買二斤白菜,一斤豬肉纯蛾,倆饅頭·······)纤房,所以在寫腳本前要清楚自己要做什么,才能給計(jì)算機(jī)描述清楚翻诉,前端后端皆是如此炮姨。
手動實(shí)現(xiàn)無密碼訪問
先手動的方式來實(shí)現(xiàn)無密碼訪問,再去研究如何寫腳本碰煌。
SSH驗(yàn)證:從客戶端來看舒岸,SSH提供兩種級別的安全驗(yàn)證。
第一種級別(基于口令的安全驗(yàn)證)
只要你知道自己帳號和口令芦圾,就可以登錄到遠(yuǎn)程主機(jī)蛾派。所有傳輸?shù)臄?shù)據(jù)都會被加密,但是不能保證你正在連接的服務(wù)器就是你想連接的服務(wù)器个少『檎В可能會有別的服務(wù)器在冒充真正的服務(wù)器,也就是受到“中間人”這種方式的攻擊稍算。
第二種級別(基于密匙的安全驗(yàn)證)
需要依靠密匙典尾,也就是你必須為自己創(chuàng)建一對密匙,并把公用密匙放在需要訪問的服務(wù)器上糊探。如果你要連接到SSH服務(wù)器上钾埂,客戶端軟件就會向服務(wù)器發(fā)出請求河闰,請求用你的密匙進(jìn)行安全驗(yàn)證。服務(wù)器收到請求之后褥紫,先在該服務(wù)器上你的主目錄下尋找你的公用密匙姜性,然后把它和你發(fā)送過來的公用密匙進(jìn)行比較。如果兩個(gè)密匙一致髓考,服務(wù)器就用公用密匙加密“質(zhì)詢”(challenge)并把它發(fā)送給客戶端軟件部念。客戶端軟件收到“質(zhì)詢”之后就可以用你的私人密匙解密再把它發(fā)送給服務(wù)器氨菇。
用這種方式儡炼,你必須知道自己密匙的口令。但是查蓉,與第一種級別相比乌询,第二種級別不需要在網(wǎng)絡(luò)上傳送口令。
說白了一種場景是:
- 服務(wù)器A: 密碼是什么
- 服務(wù)器B:******
一種場景是:
- 服務(wù)器A:天王蓋地虎
- 服務(wù)器B:寶塔鎮(zhèn)河妖
而我們要做的就是第二種校驗(yàn)豌研。
實(shí)現(xiàn)步驟
(因?yàn)橐鰎oot無密碼訪問妹田,所以所有執(zhí)行全在root下,普通用戶原理是一樣的鹃共,不過是認(rèn)證文件位置不同罷了鬼佣,sudo su -
與sudo su
的區(qū)別大家都知道的吧。
- 首先執(zhí)行
ssh-keygen -t rsa
生成密鑰對 - 將密鑰拷貝至需要無密碼訪問的機(jī)器
scp id_rsa.pub
(key訪問加-i) - 去無密碼訪問的機(jī)器將拷貝來的密鑰寫入授權(quán)列表
cat id_rsa.pub >> /root/.ssh/authorized_keys
- 文件授權(quán)
chmod 600 authorized_keys
至于為什么是這個(gè)權(quán)限忘記了 - 上述步驟中拷貝key的地方可替換為
ssh-copy-id -i /root/.ssh/id_rsa.pub
上腳本文件
腳本需要服務(wù)器安裝expect命令霜浴,atp-get或yum install就行晶衷,需要bash來執(zhí)行入口文件
- 入口文件startAuthorize.sh
#!/bin/bash
path=$(cd "$(dirname "$0")"; pwd)
sshPath="/root/.ssh/authorized_keys"
if [ ! -f "$sshPath" ]; then
echo "密鑰不存在,正在生成密鑰"
expect productKey.exp
cp /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
echo "密鑰生成完成坷随,正在修改服務(wù)器配置"
else
echo "密鑰已經(jīng)存在房铭,正在修改服務(wù)器配置"
fi
for i in `awk '{print $1}' ${path}/pwdconfig`
do
u=`awk -v I="$i" '{if(I==$1)print $2}' ${path}/pwdconfig`
p=`awk -v I="$i" '{if(I==$1)print $3}' ${path}/pwdconfig`
rp=`awk -v I="$i" '{if(I==$1)print $4}' ${path}/pwdconfig`
echo "開始修改ip為 $i 的服務(wù)器配置"
expect ${path}/initServer.exp $i $p $u $rp >/dev/null 2>&1
if [ "$?" = 0 ]; then
echo "正在為ip為 $i 的服務(wù)器授權(quán)"
expect ${path}/authorize.exp $i $rp >/dev/null 2>&1
if [ "$?" = 0 ]; then
echo "服務(wù)器 $i 授權(quán)成功"
fi
else
echo "\033[31m無法為ip為 $i 的服務(wù)器進(jìn)行授權(quán) 請重新修改服務(wù)器配置 \033[0m"
fi
done
echo "所有服務(wù)器配置修改完成"
sh ${path}/confirmServer.sh
- 生成密鑰productKey.exp
#!/bin/expect
set timeout 30
spawn -noecho ssh-keygen -t rsa
expect {
"Enter file in which to save the key" {
send "\r"
expect {
"Overwrite" {
send "y\r"; exp_continue;
}
"Enter passphrase" {
send "\r"
expect "Enter same passphrase again:"
send "\r"
}
}
}
}
expect eof
- 初始化服務(wù)器(啟用root用戶腳本)initServer.exp
#!/bin/expect
set serverIp [lindex $argv 0]
set passwd [lindex $argv 1]
set user [lindex $argv 2]
set rootPasswd [lindex $argv 3]
set timeout 30
spawn -noecho ssh -l $user $serverIp
expect {
"yes/no" { send "yes\r"; exp_continue}
"password:" {
send "$passwd\r"
expect "$user"
send "sudo su -\r"
expect "password"
send "$passwd\r"
expect "root"
send "sed -i 's/PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config\r"
expect "root"
send "service ssh restart\r"
expect "root"
send "passwd\r"
expect "UNIX"
send "$rootPasswd\r"
expect "UNIX"
send "$rootPasswd\r"
expect "root"
send "exit\r"
expect "$user"
send "exit\r"
send_user "服務(wù)器 $serverIp 配置修改成功"; exit 0
}
timeout { puts "服務(wù)器 $serverIp 連接超時(shí)"; exit 1 }
}
exit 1
- 開始授權(quán)authorize.exp
#!/bin/expect
set timeout 30
set serverIp [lindex $argv 0]
set passwd [lindex $argv 1]
spawn -noecho ssh-copy-id -i /root/.ssh/id_rsa.pub root@$serverIp
expect {
"Are you sure you want to continue connecting (yes/no)?" {
send "yes\r"; exp_continue;
}
"password:" {
send "$passwd\r"; exp_continue;
}
eof { exit 0 }
}
expect eof
- 確認(rèn)授權(quán)狀態(tài)confirmServer.sh
#!/bin/bash
path=$(cd "$(dirname "$0")"; pwd)
echo "正在檢測所有服務(wù)器連接訪問狀態(tài)"
for i in `awk '{print $1}' ${path}/pwdconfig`
do
echo "開始檢測服務(wù)器${i}的連接狀態(tài)。温眉。缸匪。"
ssh -o NumberOfPasswordPrompts=0 $i "date" > /dev/null 2>&1
if [ $? = 0 ]; then
echo "服務(wù)器${i}無密碼訪問 [\033[32m 成功 \033[0m]"
else
echo "服務(wù)器${i}無密碼訪問 [\033[31m 失敗 \033[0m]"
fi
done
- 配置文件 (ip,用戶名,密碼类溢,期望修改的root密碼) pwdconfig
192.168.20.109 cloud rd123456 123456
192.168.20.214 cloud rd123456 123456
192.168.20.104 cloud rd123456 123456
192.168.20.100 cloud rd123456 123456
192.168.20.212 cloud rd123456 123456
針對于我們公司部署情況寫的(ubuntu14)凌蔬,如有需求,可適配更改闯冷,原理都是一樣的砂心。