2017-02-17 19 views
1

スクリプトの中にsshを生成する際にawkコマンドを実行する際に問題が発生しているようです。また、私は変数に出力を得ることができません。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、コマンドラインで直接リモートホストにコマンドを送信することができます。

関連する問題