Ubuntu16.04のセットアップはスクリプトを期待します
以下の簡単なスクリプトの目標は、sshを使用してリモートマシンのディレクトリで最も古い.zipファイルを見つけることです。
次に、scpを使用して、このファイルをローカルの「workingBuild」ディレクトリにダウンロードします。
現在のスクリプト
#!/usr/bin/expect
set user "hidden"
set pass "hidden"
set sourceDir "/opt/tomcat/someDirectoryName/"
set workingDir "/home/someUser/workingBuild"
spawn sh -c "ssh $user@www ls -t $sourceDir | head -1"
expect "password:"
send "$pass\r"
expect -re ".*\.zip"
set sourceFile $expect_out(0,string)
spawn sh -c "echo 'bob'$sourceFile'bob2'"
spawn sh -c "scp $user@www:$sourceDir$sourceFile $workingDir"
expect {
password: {send "$pass\r"; exp_continue}
}
問題
保存されているファイル名の先頭にある$ sourceFile変数に非表示のキャリッジリターン(\ r)が入力されているようです。これは、ファイル名とdestinationDirectoryをそのような新しい行に配置するため、scpコマンドで問題を引き起こしています。無効なコマンドの原因:
spawn sh -c scp meliudaj@www:/opt/tomcat/someDirectoryName/
build_0.0.1.zip /home/meliudaj/workingBuild
これは、上記のコードの次のデバッグ行でも示されています。
spawn sh -c "echo 'bob'$sourceFile'bob2'"
$ sourceFile'bob2 'は常に' bob 'の下の新しい行にあります
望ましい結果は次のようになります。
spawn sh -c scp meliudaj@www:/opt/tomcat/someDirectoryName/ build_0.0.1.zip /home/meliudaj/workingBuild
質問
$ sourceFile変数から\ rを削除する方法、または(\ r)が最初から表示されないように$ sourceFile変数に別の方法でデータを入力する方法を教えてください。
PS sed、awk、trを使用してさまざまな試みを試みましたが、何も役に立たなかったようです。
パスワードを送信して「Enterキーを押す」と、sshが最初に行うことは改行を発行することです。expect_outバッファーから抽出するテキストでは、これを考慮していません。また、expectはCRNLを使用して改行を表すことに注意してください。これは、いくつかのネットワークプロコトール標準に準拠することであると私は理解しています。
このインタラクティブなexpectセッションは、問題をほぼ再現します。最後に、変数の内容を外部コマンドod
に送信して、その内容を正確に確認します。
expect1.1> spawn sh -c {read password; ls -t | head -1}
spawn sh -c read password; ls -t | head -1
42945
expect1.2> send "\r"
expect1.3> expect "*.zip"
somefile.zip
expect1.4> set sourceFile $expect_out(0,string)
somefile.zip
expect1.5> exec od -c << $sourceFile
0000000 \r \n s o m e f i l e . z i p
0000016
最後の改行の後にある「.zip」で終わるテキストをキャプチャします。正規表現を使用するのはかなり簡単です。
expect1.1> spawn sh -c {read password; ls -t | head -1}
spawn sh -c read password; ls -t | head -1
42992
expect1.2> send "\r"
expect1.3> expect -re {.*\r\n(.*\.zip)}
somefile.zip
expect1.4> set sourceFile $expect_out(1,string)
somefile.zip
expect1.5> exec od -c << $sourceFile
0000000 s o m e f i l e . z i p
0000014
を使用(1,string)
して、最初の括弧のセットでキャプチャされたテキストを取得することに注意してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加