예상 스크립트를 사용하여 여러 Linux 서버의 디스크 공간 모니터링

예상 스크립트를 사용하여 여러 Linux 서버의 디스크 공간 모니터링

여러 서버를 모니터링하기 위해 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

관련 정보