43

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

$ 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") 
4

13 に答える 13

58

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

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

-qクワイエットモードで、警告やメッセージを抑制します。

@Matが述べたように、このようなテストの利点の1つは、を好きなテストオペレーターと簡単に交換できること-fです。-nt-d-s

テストオペレーター: http ://tldp.org/LDP/abs/html/fto.html

于 2013-08-17T15:22:17.277 に答える
53

簡単なアプローチは次のとおりです。

#!/bin/bash
USE_IP='-o StrictHostKeyChecking=no username@192.168.1.2'

FILE_NAME=/home/user/file.txt

SSH_PASS='sshpass -p password-for-remote-machine'

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

fi

動作させるには、マシンにsshpassをインストールする必要があります。

于 2012-10-11T17:31:51.723 に答える
46

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

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

dimo414で提案されているように、これは次のように折りたたむことができます。

if ssh host "test -e /path/to/file"; then
    # your file exists
fi
于 2015-04-15T01:15:40.050 に答える
12

1行、適切な引用

ssh remote_host test -f "/path/to/file" && echo found || echo not found
于 2015-08-28T12:19:58.587 に答える
7

あなたは;sを逃しています。すべてを1行にまとめると、一般的な構文は次のようになります。

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

thingは、終了コードを返すほとんどすべてのものにすることができます。0を返す場合はthen分岐が取得され、それ以外の場合は分岐が取得されます。thingelse

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

あなたの場合、test直接使用するのではなく、リモートホストで何かをテストする必要があります。したがって、次のようなものを試してください。

if ssh user@host test -e "$file" ; then ... ; else ... ; fi
于 2012-10-11T17:31:48.157 に答える
3
ssh -q $HOST [[ -f $FILE_PATH ]] && echo "File exists"

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

ssh -q $HOST "[[ ! -f $FILE_PATH ]] && touch $FILE_PATH"
于 2013-12-04T04:00:19.770 に答える
3

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

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
于 2018-02-06T04:40:39.560 に答える
1

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

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
于 2013-12-09T16:28:45.237 に答える
1

ファイルが存在するかどうかをサイレントチェックし、存在しない場合は実行します

if ! ssh $USER@$HOST "test -e file.txt" 2> /dev/null; then
  echo "File not exist"
fi
于 2021-08-20T14:44:20.587 に答える
0

リモートファイルが存在するかどうかも確認したかったのですが、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
}
于 2016-07-12T11:40:33.747 に答える
0

CentOSマシンでは、私のために機能したワンライナーバッシュは次のとおりでした。

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

リモートで実行するには、I / Oリダイレクト(トップアンサーとして)とコマンドの前後の引用符が必要でした。

于 2016-12-29T13:38:20.880 に答える
-1

これも機能します:

if ssh user@ip "[ -s /path/file_name ]" ;then 
  status=RECEIVED ; 
 else 
  status=MISSING ; 
 fi
于 2019-09-11T11:24:50.587 に答える
-1
#its simple

if [[ "`ssh -q user@hostname ls /dir/filename.abc 2>dev/null`" == "/dir/filename.abc" ]]
then
    echo "file exists"
else
    echo "file not exists"
fi
于 2021-03-31T14:47:26.533 に答える