예상되는 스크립트 오류 - 따옴표를 닫은 후 추가 문자

예상되는 스크립트 오류 - 따옴표를 닫은 후 추가 문자

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

확인을 위해 값을 에코합니다.

관련 정보