2016-05-04 7 views
1

Linuxにexpectスクリプトを記述しようとしています。リモートファイルが存在するかどうかを確認し、expectスクリプトで他の操作を実行します。

  • SSH
  • を使用してリモートのWindowsマシンにログインし、特定のファイルが
  • は、同じパスに他のファイルのタイムスタンプを比較して、ステップ1では

新しい場合、印刷が存在するかどうかをチェックし、ファイルが存在するかどうかを確認するために1つのコマンドを送信しようとしていますが、動作しません。

log_user 1 
spawn ssh -o "StrictHostKeyChecking=no" [email protected]$hostname 
expect { 
..... user and password checks 
..... 
send "IF EXIST C:\\path\\to\\file\\temp.zip (echo FOUND) else (echo NOTFOUND)\r" 
expect "path" { 
    set result $expect_out(buffer) 
    puts $result 

    if{$result=="FOUND"} { 
     #compare with temp2.zip here 
    } 
} 

結果は常に私は出力FOUNDまたはNOTFOUNDを送信していません。誰かが私がここで間違っていることを教えてもらえますか?

+0

私はWindows、bash、バッチファイルのタグがここに属していないと感じていますが、あなたが何を求めているのか十分に分かりません。 – SomethingDark

+0

古いMac(Mac OS 9まで)と話しているのでない限り、通常は\ rを送信するのは間違いです。 – IInspectable

+0

@somethingdarkリモートサーバでwindowsコマンドを実行するためにexpectスクリプトを使用しています – Nagarjun

答えて

1

パターンマッチングを使用する代わりに、スクリプトは手動でバッファを処理しようとしますが、バッファには "(NOT)FOUND"というテキストのみが含まれるという誤った仮定をします。バッファには、最後にコマンドexpectが使用されて以来、受信したすべてが実際に格納されます。しかし、バッファに正しく一致したとしても(string match *NOTFOUND* $resultなど)、the echo problemの影響を受けます。送信するコマンドに "FOUND"と "NOTFOUND"という文字列が含まれています。 SSHサーバー。

スクリプトの次の変更は、予想されるリテラル文字列を送信しないことで、エコー問題をハックします。

Windows側のBitvise SSHサーバーで動作します。

log_user 1 
spawn ssh -o "StrictHostKeyChecking=no" [email protected]$hostname 
# Log in here. 
send "set prefix=___\r" ;# Combat the echo problem. 
send "IF EXIST C:\\path\\to\\file\\temp.zip (echo %prefix%FOUND) else (echo %prefix%NOTFOUND)\r" 
expect { 
    ___NOTFOUND { 
     error {file not found} 
    } 
    ___FOUND { 
     send_user Found!\n 
     # Do things with the file. 
    } 
} 
+0

素晴らしい、あなたはブルズアイをヒットします。私はここでエコーの問題を見逃していました:-) – Nagarjun

関連する問題