이 코드가 있고 명령의 출력을 읽고 처음부터 특수 문자까지 부분 문자열로 묶은 다음 섹션이 비어 있지 않으면 전달되는 로그를 보내길 원합니다. 하지만 어떻게 해야할지 모르겠습니다. 지금까지 내가 얻은 것은 다음과 같습니다.
#!/opt/tools/unsupported/expect-5.39/bin/expect
spawn ssh -l $USER $VMIP_1
expect_after eof {exit 0}
set timeout 10
match_max 256
expect "(yes/no)?" { send "yes\r" }
expect "password:" { send "$PASSWORD\r" }
expect "~]#" { send "date\r" }
expect "~]#" { send "pidof snmpd\r" }
sleep 5
expect "~]#" {
set buf [split $expect_out(buffer) "[root@"]
if {[lindex $buf 0] !=="" }
{
log_file /home/bebehman/vnf/trunk/report.txt
send_log "Verify net-snmp installation and functionality on $VMIP_1--------------------- Passed\n"
} else { send_log "Verify net-snmp installation and functionality on $VMIP_1--------------------- Failed\n"
}
}
답변1
split
생각대로 되지 않으니 참고하세요 . 단어를 기준으로 분할되지 않고 두 번째 문자열에 제공된 문자를 기준으로 분할됩니다. 예를 들어, 시퀀스가 포함되어 있지 않더라도 두 부분 split "xax" "abc"
으로 나뉩니다 .xax
abc
예를 들어, 특정 하위 문자열에서 문자열을 분할하는 간단한 방법은 명령을 사용하여 string first
하위 문자열의 시작 부분을 찾은 다음 string range
해당 지점에 복사하는 것입니다.
set str $expect_out(buffer)
set v [string range $str 0 [string first "\[root@" $str]-1]
v
그런 다음 비어 있는지 테스트할 수 있습니다 .
또는 을 실행하는 대신 expect "~]#"
을 실행 expect "\[root@"
하면 $expect_out(buffer)
추출하려는 내용이 이미 포함됩니다.
이전 버전의 tcl/expect에서는 숫자-숫자 형식을 허용 expr
하는 대신 인덱스에서 1을 빼야 할 수도 있습니다 . string range
예를 들어 다음을 사용하십시오.
set v [string range $str 0 [expr [string first "\[root@" $str] - 1]]
답변2
if {[lindex $buf 0] !=="" }
{
컴파일되지 않습니다. 대신 이것이 필요합니다.
if { [lindex $buf 0] != "" } {