expect
스크립트에 언급된 자격 증명을 사용하여 서버 목록에 SSH를 수행하는 스크립트가 있습니다 . SSH를 통해 특정 서버에 연결할 수 없는 경우 오류가 발생하지 않고 목록의 다음 서버에 계속 연결됩니다. 주어진 비밀번호로 SSH를 수행할 수 없을 때 스크립트에서 알려주기를 원합니다. 이 작업을 수행하려면 스크립트를 어떻게 변경해야 합니까?
첫 번째 스크립트는 Expect 스크립트를 호출하는 쉘 스크립트입니다.
#!/usr/bin/ksh
for host_name in `cat list`
do
/home/user1/ssh_script $host_name
done
#!/usr/local/bin/expect -f
set timeout 1
set host_name [lindex $argv 0]
spawn ssh -q -o StrictHostKeyChecking=no "user1\@$host_name"
expect "*assword:"
send "abcd@123\r";
expect "$\r"
puts "user1 loggedin successfully"
exit
interact
답변1
라인의 시간 초과 "패턴"을 일치시킬 수 있습니다 expect
. 예를 들어,
#!/usr/bin/expect -f
proc abort { } { send_user "Timeout!" ; exit 2 }
set timeout 1
set host_name [lindex $argv 0]
spawn ssh -q -o StrictHostKeyChecking=no "user1\@$host_name"
expect timeout abort "assword:"
send "abcd@123\r"
expect timeout abort "assword: " { send_user "bad password\n"; exit 3 } "$\r"
puts "user1 loggedin successfully"
이렇게 하면 시작 부분에 일련의 프로시저가 추가되고 각 항목에 abort
패턴 + 작업 시퀀스가 추가됩니다 . 이렇게 하면 시간 초과가 예상되는 경우 프로시저가 호출됩니다. 프로시저는 stdout에 문자열을 쓰고 기본값 0 대신 반환 코드 2로 종료됩니다. 원하는 경우 ksh 스크립트에서 이 종료 코드를 테스트할 수 있습니다.timeout abort
expect
"$"
잘못된 로그인 비밀번호를 감지하려면 정상적으로 로그인했다는 메시지와 동시에 두 번째 비밀번호 프롬프트를 찾아보세요.