web-dev-qa-db-ja.com

sshを使用してリモートホストにファイルが存在するかどうかを確認します

特定のファイルがリモートホストに存在するかどうかを確認したいと思います。私はこれを試しました:

$ if [ ssh user@localhost -p 19999 -e /home/user/Dropbox/path/Research_and_Development/Puffer_and_Traps/Repeaters_Network/UBC_LOGS/log1349544129.tar.bz2 ] then echo "okidoke"; else "not okay!" fi
-sh: syntax error: unexpected "else" (expecting "then") 
31
stdcerr

簡単なアプローチを次に示します。

if ssh $Host stat $FILE_PATH \> /dev/null 2\>\&1
            then
                    echo "File exists"
            else
                    echo "File does not exist"

fi
37

上記の答えに加えて、それを行う簡単な方法があります:

ssh -q $Host [[ -f $FILE_PATH ]] && echo "File exists" || echo "File does not exist";

-qはQuietモードであり、警告とメッセージを抑制します。

@Matが述べたように、このようなテストの利点の1つは、-f好きなテスト演算子:-nt-d-s etc ...

テスト演算子:http://tldp.org/LDP/abs/html/fto.html

40
JP Lew

これよりもはるかに簡単になることはできません:)

ssh Host "test -e /path/to/file"
if [ $? -eq 0 ]; then
    # your file exists
fi
22
karni

1行、適切な引用

ssh remote_Host test -f "/path/to/file" && echo found || echo not found
9
estani

あなたは間違っている ;s。すべてを1行に入れる場合の一般的な構文は次のとおりです。

if thing ; then ... ; else ... ; fi

thingは、終了コードを返すほとんどすべてのものです。 thenブランチが取得されるのは、そのthingが0を返す場合、elseブランチがそれ以外の場合です。

[は構文ではなく、testプログラムです(ls /bin/[、実際に存在する、man testドキュメント用–さまざまな/追加の機能を備えたビルトインバージョンを持つこともできます。)これは、ファイルおよび変数のさまざまな一般的な条件をテストするために使用されます。 (ご了承ください [[一方でis構文であり、それがサポートされている場合はシェルによって処理されます)。

あなたの場合、testを直接使用したくない、リモートホストで何かをテストしたい。次のようなものを試してください:

if ssh user@Host test -e "$file" ; then ... ; else ... ; fi
5
Mat

ファイルが存在するかどうかをテストします。

Host="example.com"
FILE="/path/to/file"

if ssh $Host "test -e $FILE"; then
    echo "File exists."
else
    echo "File does not exist."
fi

逆に、ファイルが存在しないかどうかをテストします。

Host="example.com"
FILE="/path/to/file"

if ! ssh $Host "test -e $FILE"; then
    echo "File does not exist."
else
    echo "File exists."
fi
3
rouble
ssh -q $Host [[ -f $FILE_PATH ]] && echo "File exists"

上記は、sshコマンドを実行しているマシンでechoコマンドを実行します。リモートサーバーにコマンドを実行させるには:

ssh -q $Host "[[ ! -f $FILE_PATH ]] && touch $FILE_PATH"
3
None

リモートホストがローカルで使用するシェルを指定できます。

echo 'echo "Bash version: ${BASH_VERSION}"' | ssh -q localhost bash

また、リモートホストによって展開される変数を(単一)引用符で囲むように注意してください。そうでない場合、変数の展開はローカルシェルによって行われます!

# example for local / remote variable expansion
{
echo "[[ $- == *i* ]] && echo 'Interactive' || echo 'Not interactive'" | 
    ssh -q localhost bash
echo '[[ $- == *i* ]] && echo "Interactive" || echo "Not interactive"' | 
    ssh -q localhost bash
}

したがって、特定のファイルがリモートホストに存在するかどうかを確認するには、次の操作を実行できます。

Host='localhost'  # localhost as test case
file='~/.bash_history'
if `echo 'test -f '"${file}"' && exit 0 || exit 1' | ssh -q "${Host}" sh`; then
#if `echo '[[ -f '"${file}"' ]] && exit 0 || exit 1' | ssh -q "${Host}" bash`; then
   echo exists
else
   echo does not exist
fi
1
tarok

CentOSマシンで、私のために働いたoneliner bashは次のとおりでした。

if ssh <servername> "stat <filename> > /dev/null 2>&1"; then echo "file exists"; else echo "file doesnt exits"; fi

I/Oリダイレクト(トップの答えとして)と、リモートで実行するコマンドを囲む引用符が必要でした。

0
Abhimanu Kumar

リモートファイルが存在するが、RSHがあるかどうかも確認したかった。以前のソリューションを試しましたが、RSHで動作しませんでした。

最後に、正常に機能する関数を短くしました:

function existRemoteFile ()
{
REMOTE=$1
FILE=$2
RESULT=$(rsh -l user $REMOTE  "test -e $FILE && echo \"0\" || echo \"1\"")
if [ $RESULT -eq 0 ]
then
    return 0
else
    return 1
fi
}
0
miguialberto