send if 명령을 실행하는 동안 오류가 발생했습니다. 일부 tcl 구문이 누락되었는지 확실하지 않습니다.
#!/usr/bin/expect -f
# Get the list of hosts, one per line #####
set f [open "/tmp/host.txt"]
set hosts [read $f]
close $f
# Iterate over the hosts
foreach host $hosts {
spawn ssh $host
expect "password: "
send "abcd@123\r"
expect "$ "
send "if [ `df -Ph / | grep -vE '^Filesystem' | awk '{ print $5 " " $1 }' |cut -d'%' -f1` -ge 60 ] ;then echo "Hi Team- Please check root file system space on `hostname` " | mailx -s "Alert: Almost out of disk space on `hostname`" [email protected] ;fi\r"
expect "$ "
send "exit\r"
expect eof }
===오류===
[root@hzavks01~]# extra characters after close-quote
while executing
"send "if [ `df -Ph / | grep -vE '^Filesystem' | awk '{ print $5 " " $1 }' |cut -d'%' -f1` -ge 60 ] ;then echo "Hi Team- Please check root file system..."
("foreach" body line 6)
invoked from within
"foreach host $hosts {
spawn ssh $host
expect "password: "
send "abcd@123\r"
expect "$ "
send "if [ `df -Ph / | grep -vE '^Filesystem' | awk '{ print $5..."
(file "./test.sh" line 10)
답변1
TCL은 간단하다. 이 경우 mosvy
주석에서 볼 수 있듯이 {...}
보간법을 사용하여 까다로운 셸 코드를 비활성화합니다. 그러나 \r
입력 명령은 이스케이프할 수 없으며 send
프로세스에는 단일 문자열이 필요하므로 문자열을 함께 연결하거나 두 번의 send
호출을 사용하십시오.
#!/usr/bin/env expect
catch {exec rm foo}
log_file expect.log
spawn -noecho sh
expect -ex {$ }
send {df | awk '/\//{print $NF}' > foo}
send "\r"
expect -ex {$ }
send -- {exit}
send "\r"
expect eof
sendline
\r
이는 코드 혼란을 방지하기 위해 작업 프로세스를 통해 개선될 수 있습니다 .
#!/usr/bin/env expect
proc sendline {line} { send -- "$line\r" }
spawn -noecho sh
expect -ex {$ }
sendline {df | awk '/\//{print $NF}' > foo}
expect -ex {$ }
sendline "exit"
expect eof
보간이 필요한 경우 역추적이 필요하지만 이 경우 쉘 코드를 제거하고 대신 원격 시스템에서 직접 프로그램을 호출하여 필요한 작업을 수행하거나 사용하기 쉬운 형식으로 필요한 출력을 생성하는 것이 좋습니다. 형태 .
답변2
스크립트 시작 부분에 사용자 이름과 비밀번호를 설정하여 작업을 시작했습니다.
set Username "END_USER"
내 비밀번호는pas\Sw)/ord
16진수가 있는 곳에 특수 문자를 설정해야 합니다.
\
예\x5c
)
예\x29
/
예\x2f
"
그래서 처음과 끝 이 아닌 아래 구문을 사용하여 설정해야 합니다 "
.
set Password pas\x5cSw\x29\x2ford
16진수 값은 다음에서 찾을 수 있습니다.http://defindit.com/ascii.html
당신은 또한 사용할 수 있습니다
puts "$Username"
puts $Password
확인을 위해 값을 에코합니다.