바로 앞 글에서 윈도우 서버 패스워드 변경에 대해 이야기 했었는데, 이번엔 리눅스 서버입니다.

리눅스에 expect라고 재미있는 프로그램이 있더군요. 윈도우의 Autoit과 비슷한데, 쉘에서 대화형으로 특정 문구가 나오면 특정 문자열을 보내는 방식입니다. 그래서 이 expect를 이용해 자동 로그인 + 패스워드 변경 작업을 반복하도록 스크립트를 작성해 봤습니다. 스크립트는 매우 간단한데, 고수님들 지적할 부분 있다면 지적해 주시기 바랍니다.

일단 작업하려는 마스터 서버에 expect를 설치합니다. 저는 Fedora14에 yum으로 설치했습니다.

yum -y install expect



제가 작성한 코드는 아래와 같습니다.

expect.sh
=> 실질적으로 패스워드를 변경하는 모듈

passchg.sh
=> serverlist.txt 파일에서 한줄씩 읽어들이며 각 토큰을 (ip, 기존pw, 신규pw) expect.sh에 인자로 넘겨줌

serverlist.txt
=> IP, 기존pw, 신규pw를 나열해둔 파일


ex) expect.sh
#!/usr/bin/expect
set ipaddr [lindex $argv 0]
set oldpass [lindex $argv 1]
set newpass [lindex $argv 2]
spawn ssh root@$ipaddr
expect "(yes/no)?"
send "yes\r"
expect "password:"
send "$oldpass\r"
expect "#"
send "passwd --stdin root\r"
expect "root."
send "$newpass\r"
expect "#"
send "exit\r"
expect eof


ex) passchg.sh
#! /bin/bash
while read line
do
ipaddr=`echo $line | awk '{print $1}'`
oldpass=`echo $line | awk '{print $2}'`
newpass=`echo $line | awk '{print $3}'`
rm -f /root/.ssh/*
./expect.sh $ipaddr $oldpass $newpass
done < serverlist.txt


ex) serverlist.txt
192.168.1.101 ,o65|Hn*). WS.7Y/khl7
192.168.1.102 L,Y{CRk?UZ {-5uqrMWo!
192.168.1.103 E*qtGrq6i2 C8:"#Mj56d
192.168.1.104 '!@(mf:UjK u0EVfut:Oc
192.168.1.105 -&l"{q(@&7 KmlPX\K9bI
192.168.1.106 Btl;g)'|\U MR3F3h<.@@
192.168.1.107 DW91ZX$4!~ {\$QQieixT
192.168.1.108 q2CI:~|9`~ o>cL:qs6xs
192.168.1.109 }%>XRN|mFb l5GlJX-,5P
192.168.1.110 ykz[s>(P'% 64r2U{d}9$


이렇게 파일 3개를 만든 다음 sh 파일은 chmod 744 정도로 잡아서 excute 가능하게 설정해주시고

./passchg.sh > result.txt

이런 식으로 결과물을 result.txt 파일에 저장하면서 실행을 합니다. 결과물을 저장하는 이유는 한번에 100대 정도를 처리할 경우 분명 중간에 네트워크 연결 문제나 기존 패스워드 불일치 문제로 오류나는 경우가 몇대 정도는 발생할 것이기 때문입니다. 만약 오류 없이 100대 모두 정상 처리가 된다면 약 1분 안에 작업이 끝날 것입니다.