여러 서버를 모니터링하기 위해 Expect를 사용하여 스크립트를 작성하려고 합니다. 연결은 비밀번호를 사용하여 SSH를 통해 이루어집니다.
내 기본 루프가 자동으로 실패하고 Expect TCL 언어가 Linux for 루프 구문을 허용하는지 확실하지 않습니다.
암호:
#!/usr/bin/expect -f
server_list="/tmp/DR.txt"
for HOST in $(cat $server_list) ; do
spawn ssh -q $HOST
expect "assword:"
send "Abcd@123\r"
interact
echo ' '
echo "====For space utilization details for server $HOST===" >/tmp/space_utilization.log
Df -kh >> /tmp/space_utilization.log
echo ' '
done
파일에는 /tmp/DR.txt
다음과 같은 100개의 서버 이름 목록이 포함되어 있습니다.
hzavks01
dzavks20
dzavks03
uzavks05
acavks30
내가 얻는 오류는 다음과 같습니다.
[root@dzavks20 tmp]# ./expect.sh
invalid command name "server_list=/tmp/DR"
while executing
"server_list=/tmp/DR"
(file "./expect.sh" line 2)
답변1
Expect를 사용해야 하나요? SSH를 통해 원격으로 df 명령을 실행하고 정보를 단일 파일로 수집하는 간단한 bash 쉘을 가질 수 있습니까?
호출 서버에서 모든 서버로의 SSH 키가 구성 파일에 올바르게 설정되어 있으면 비밀번호를 입력할 필요가 없습니다. 다음 루프는 모든 서버에서 df 출력을 수집합니다.
while read -r h; do
echo "=== Space utilization for ${h} ==="
ssh "$h" df -kh
echo ""
done </tmp/DR.txt >/tmp/space_utilization.log
답변2
가능하다면 SSH 개인 키 인증을 사용하세요. 일단 설정되면 그것에 대해 생각할 필요가 없습니다. 또한 비밀번호를 일반 텍스트로 저장할 필요가 없습니다.
또한 코드는많은더 복잡한:
#!/usr/bin/expect -f
set server_list /tmp/DR.txt
set fh_hosts [open $server_list r]
# truncate the log file
set log_file /tmp/space_utilization.log
close [open $log_file w]
set pass "Abcd@123"
set prompt_re {\$ $}
while {[gets $fh host] != -1} {
spawn ssh -q $host
expect "assword:"
send "$pass\r"
expect -re $prompt
set cmd "df -kh"
send "$cmd\r"
expect -re "$cmd\r\n(.*)\r\n$prompt"
log_file $log_file
send_log "\n"
send_log "====Space utilization for server $host at [timestamp -format +"%Y-%m-%d %T"]===\n"
send_log -- $expect_out(1,string)
send_log "\n\n"
log_file
send "exit\r"
expect eof
}
close $fh_hosts