SSHおよびifステートメントを使用してファイルがリモートサーバーにチェックインされたかどうかをテストする方法

SSHおよびifステートメントを使用してファイルがリモートサーバーにチェックインされたかどうかをテストする方法

ファイルがあるかどうかをテストしようとしています$SSHPATH/$ID.*sshpassパスワードを入力する必要がないようにパスワードを提供するために使用します。

ファイルが存在しない場合は、コードを実行したい

if [ "sshpass -p $SSHPASS ssh root@$SSHHOST test ! -f $SSHPATH/$ID.*" ]; then

ファイルがリモートサーバーに存在していてもtrueを返すようです。なぜ?

重複ではないと思います。コマンドが成功または失敗した場合に条件付きで操作を実行する方法これも機能しないため、ファイルが存在しないと実行されません。

if sshpass -p "$SSHPASS" ssh "root@$SSHHOST" test ! -f "$SSHPATH/$ID.*"; then

ベストアンサー1

pLumoが説明するように、テストは常に成功します。

あなたが望むのは、あなたのパターンがどんな$SSHPATH/$ID.*ものに拡張できるかをテストすることです。パターンは複数の名前に拡張でき、テストは単一のパス名にのみ適用できるため、これは-f通常のファイルのテストとは異なります。-f

ローカルでは、次のコマンドを使用してこれを実行できます。

set -- "$SSHPATH/$ID".*
if [ -e "$1" ]; then ...; fi

これは、位置パラメータ(など)を与えられたパターンと一致する名前$1に設定します。その後、これらのステートメントは最初の一致が既存の名前であるかどうかをテストします(パターンが一致するものがない場合、ほとんどのシェルでは拡張されていません)。$2setif

これを実行するにはssh:

ssh user@host "set -- '$SSHPATH/$ID'.*; [ -e \"\$1\" ]"

不安定な基準はこれを保証し$SSHPATH拡張$IDします。地元のシェルと"$1"リモート拡張。

sshパターンが既存の名前と一致する場合、終了ステータスは0(「成功」)であり、一致しない場合、または何らかの方法で失敗した場合、終了ステータスは0ではありません(「失敗」)。

if次の宣言で使用できます。

if ssh user@host "set -- '$SSHPATH/$ID'.*; [ -e \"\$1\" ]"; then
   # do something for success
else
   # do something for failure
fi

テストいいえ- 存在、音声テスト:

if ssh user@host "set -- '$SSHPATH/$ID'.*; [ ! -e \"\$1\" ]"; then
   # do something for failure
else
   # do something for success
fi

私はあなたの使用を見落としましたが、sshpassおそらくssh 質問でしたようにプレフィックスを付けることができます。

おすすめ記事