Expectスクリプトの変数からキャリッジリターン(\ r)を削除する

Expectスクリプトの変数からキャリッジリターン(\ r)を削除する

設定 Ubuntu 16.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}
}

質問

保存されたファイル名の前に隠されたキャリッジリターン(\ r)を使用して$ sourceFile変数を埋めるようです。これにより、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を使ってさまざまな試みを試しましたが、何も役に立たないようです。

答え1

パスワードを送信して「Enter」を押した後、sshが最初にすることは改行文字をエクスポートすることです。 Expect_outバッファから抽出されたテキストはこれを考慮していません。また、期待はCRNLを使用して改行を表します。これは、一部のネットワークプロトコル標準と一致する必要があることを理解しています。

このインタラクティブな予想セッションは、問題をほぼ再現します。最後に、変数の内容を外部コマンドに送信して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)最初の角かっこセットでキャプチャされたテキストを取得するために使用されます。

関連情報