SSHを介してスクリプトを実行し、ホスト内のいくつかのvar / comandを評価します。

SSHを介してスクリプトを実行し、ホスト内のいくつかのvar / comandを評価します。

サーバー間で一部のデータを移行するスクリプトを作成しています。

私の頭痛:

(...)
ssh -t -i ${KEY} ${USER}@${HOST} "cd /home/${ACCOUNT}/var/${DOMAIN}/ && tar cf - mail/ -P | pv -s $(du -sb mail/ | awk '{print $1}') | gzip > mail.tar.gz"

コマンドは「メールフォルダが見つかりません」などの内容を返し、その理由がわかります。

このコマンドはSSH接続の前に評価され、pv -s $(du -sb mail/ | awk '{print $1}')メールフォルダは最初のサーバーには存在しません。ただし、現在のバイトサイズをハードコードすると、スクリプトは機能します。

この状況をどのように迂回できますか?

私は使用しますが、'すでに使用しており、 '{print $1}'似たようなものに合わせて別の変数を作成してみましたが、'pv -s $(du -sb mail/ | awk \'{print $1}\') 'まだ幸運ではありませんでした。一重引用符と二重引用符を使用して多くの可能性を試しました。

PS:「英語」のため申し訳ありません。

トピックから抜け出す:誰かが私に変数宣言、表示、評価のすべての可能性を説明/表示する良い記事(または検索する主なキーワード)を教えてくれたらうれしいです。正しい用語がわからない。 ${var} や $var と同様に、"or を使うときに echo は何をし'、重複した引用符、二重引用符、連結などをエスケープする方法は何ですか?


フルスクリプトの例:

clear
printf "\n\n"
echo "********************************  INTERWORX --> CPANEL  *************************************"
printf "\n\n"

USER=root
HOST=xxx.xxx.xxx.xxx
PORT=xxxx
KEY=/var/somewhere
# ----------------
ACCOUNT=myaccount
DOMAIN=example.com

printf " ► ---------------------- [ ${HOST} ]\n"
printf " ►►---------------------- \n"

ssh -t -i ${KEY} ${USER}@${HOST} "cd /home/${ACCOUNT}/var/${DOMAIN}/ && tar cf - mail/ -P | pv -s \$(du -sb mail/ | awk '{print $1}')  | gzip > mail.tar.gz"

printf "\n ►►► ------------ [ mail.tar.gz ]\n\n"

scp -i ${KEY} ${USER}@${HOST}:/home/${ACCOUNT}/var/${DOMAIN}/mail.tar.gz .
                          ( ... )

ベストアンサー1

ご意見でデバッグオプションについて言及したので、次のような答えが必要だと思います。

set -xシーケンスの最初のコマンドとして使用されます

ssh -t -i ${KEY} ${USER}@${HOST} "set -x ; cd /home/${ACCO ....."

これはあなたのケースで失敗点を明確に示しています。

逃げられない $1

....
    ++ du -sb mail/
    + pv -s 12314 mail/   # <<< awk printed all the line instead of expected just 1st column with size and that ruined the command
    pv: mail/: read failed: Is a directory
...

そして脱出

....
 ++ du -sb mail/
 + pv -s 12314    # <<< pv gets expected number
      10kiB 0:00:00 [ 184MiB/s] [=======
....

おすすめ記事