리눅스 서버 root 패스워드 한꺼번에 변경하기
2011. 6. 11. 17:21 |
리눅스
바로 앞 글에서 윈도우 서버 패스워드 변경에 대해 이야기 했었는데, 이번엔 리눅스 서버입니다.
리눅스에 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
ex) passchg.sh
ex) serverlist.txt
이렇게 파일 3개를 만든 다음 sh 파일은 chmod 744 정도로 잡아서 excute 가능하게 설정해주시고
./passchg.sh > result.txt
이런 식으로 결과물을 result.txt 파일에 저장하면서 실행을 합니다. 결과물을 저장하는 이유는 한번에 100대 정도를 처리할 경우 분명 중간에 네트워크 연결 문제나 기존 패스워드 불일치 문제로 오류나는 경우가 몇대 정도는 발생할 것이기 때문입니다. 만약 오류 없이 100대 모두 정상 처리가 된다면 약 1분 안에 작업이 끝날 것입니다.
리눅스에 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
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
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분 안에 작업이 끝날 것입니다.
'리눅스' 카테고리의 다른 글
리눅스에서 iSCSI Target에 연결하는 방법 (13) | 2011.11.29 |
---|---|
리눅스 아파치 웹서버 구축하기 - XAMPP (20) | 2011.11.21 |
리눅스 bash 선택문 만들기 (10) | 2011.10.27 |
리눅스 추천 SSH 클라이언트 - Xshell (14) | 2011.09.25 |
리눅스에서 Ping 테스트시 시각 표시하기 (2) | 2011.09.25 |
Citrix XenCenter에서 리눅스 싱글모드 부팅 - root 패스워드 초기화 (7) | 2011.05.16 |
리눅스 root 패스워드 일괄 변경하기 (11) | 2011.05.16 |
리눅스에서 일반 계정으로 httpd 80포트 실행하기 (38) | 2011.05.07 |
최근에 달린 댓글 최근에 달린 댓글