2017-02-17 29 views
1

Кажется, что проблема, выполняющая команду awk в swn ssh в моем скрипте. Кроме того, я не могу получить вывод переменной.ожидают, что скрипты выполнят команду awk и выдают puttng expect_out в переменной.

set file [open "hosts.test"] 
set hosts [split [read -nonewline $file] "\n"] 
close $file 

foreach host $hosts { 
     puts $host 
     spawn ssh -q -o StrictHostKeyChecking=no [lindex $argv 0]@$host 
     expect "Password: " 
     send "[lindex $argv 1]\r" 
     expect -re "(>|#) " 
     send "sudo su -\r" 
     expect "Enter YOUR password: " 
     send "[lindex $argv 1]\r" 
     expect -re "(>|#) " 
     send "cat /etc/SuSE-release | awk -F= '/=/ {print \$2}' | sed -e 's/ * //g' | tr '\012' '.' | sed -e 's/\.$//'" 
     set version $expect_out(buffer) 
     expect -re "(>|#) " 
     puts "$version" 
     send "exit\r" 
     expect -re "(>|#) " 
     send "logout\r" 
} 

Ошибка:

# " 
send: sending "cat /etc/SuSE-release | awk -F= '/=/ {print $2}' | sed -e 's/ * //g' | tr '\n' '.' | sed -e 's/.$//'" to { exp4 } 
Gate keeper glob pattern for '(>|#) ' is ''. Not usable, disabling the performance booster. 

expect: does "\u001b(B\u001b[m" (spawn_id exp4) match regular  expression "(>|#) "? (No Gate, RE only) gate=yes re=no 
cat/
expect: does "\u001b(B\u001b[mcat /" (spawn_id exp4) match regular expression "(>|#) "? (No Gate, RE only) gate=yes re=no 
etc/Su 
expect: does "\u001b(B\u001b[mcat /etc/Su" (spawn_id exp4) match regular expression "(>|#) "? (No Gate, RE only) gate=yes re=no 
SuSE-release | awk -F= '/=/ {print $2}' | sed -e 's/ * //g' | tr ' 

' '.' | sed -e 's/.$//' expect: does "\u001b(B\u001b[mcat /etc/SuSE-release | awk -F= '/=/ {print $2}' | sed -e 's/ * //g' | tr '\r\n> ' '.' | sed -e 's/.$//'" (spawn_id exp4) match regular expression "(>|#) "? (No Gate, RE only) gate=yes re=yes expect: set expect_out(0,string) "> " expect: set expect_out(1,string) ">" expect: set expect_out(spawn_id) "exp4" expect: set expect_out(buffer) "\u001b(B\u001b[mcat /etc/SuSE-release | awk -F= '/=/ {print $2}' | sed -e 's/ * //g' | tr '\r\n> " send: sending "exit\r" to { exp4 } Gate keeper glob pattern for '(>|#) ' is ''. Not usable, disabling the performance booster.

expect: does "' '.' | sed -e 's/.$//'" (spawn_id exp4) match regular expression "(>|#) "? (No Gate, RE only) gate=yes re=no 
exit 

ответ

1

Я не expect эксперта, но вы можете упростить, что разбор совсем немного, делая это:

awk '/VERSION/ {a=$3} /PATCHLEVEL/ {a=a"."$3} END{print a}' /etc/SuSE-release 

Или если вам нравятся вещи более краткими, но менее очевидными:

awk '/=/ {a=a?a"."$3:$3} END{print a}' /etc/SuSE-release 

Возможно, вам придется избегать нескольких вещей, возможно, так?

send "awk '/VERSION/ {a=\$3} /PATCHLEVEL/ {a=a\".\"\$3} END{print a}' /etc/SuSE-release" 

Кроме того, вы можете посылать команды на удаленный хост непосредственно в ssh командной строки, которая могла бы быть другой путь, чтобы исследовать.