web-dev-qa-db-ja.com

ローカルLinuxスクリプトからリモートSFTPサーバーにファイルが存在するかどうかを確認するにはどうすればよいですか?

WindowsSFTPサーバーからファイルをダウンロードするためのshスクリプトを書いています。ただし、その前に、ファイルが存在するかどうかを確認したいと思います。

Winexeをダウンロードしたり、ssh Host@host test -f fileやその他の方法を実行したりすることを提案する質問はたくさんありましたが、私の場合はすべてが機能しませんでした。私は何もインストールすることを許可されておらず、すぐに使えるユーティリティを使用する必要があります。

2
drum

標準(OpenSSH)SFTPクライアントは、ファイルの存在またはそれに近いものをテストする機能を提供していません。


ソリューションをプラットフォームに依存しないようにするための唯一のインターフェイスはSFTPプロトコルであると想定しています(Windowsに接続している場合)。したがって、SSH端末を介してtestを実行するようなソリューションは実行可能ではありません(自分で確認したように)。


ファイルが存在しない場合に失敗するわずかなオーバーヘッドでSFTPコマンドを使用することにより、これを回避できます。そして、sftp終了コードをテストします(エラーの場合は1、OKの場合は0)。

そのためにdf(ディスクフリー)コマンドを悪用する可能性があります。

echo "df myfile.txt" | sftp -b - example.com
if [ $? -eq 0 ]
then
    echo "File exists"
else
    echo "File does not exist"
fi

ただし、dfコマンドはSFTPプロトコルの独自のOpenSSH拡張機能を内部的に使用します([email protected])。したがって、Windows SFTPサーバーがそれをサポートしているかどうかを、最初にテストする必要があります。明らかに、OpenSSH(MS Win32ビルドまたはCygwin)を使用している場合は、問題ありません。


dfが機能しない場合、他の唯一のオプションはファイルのダウンロードを試みることです。

理想的には、すべての「ファイルが存在する必要がある既存のプロセスがすでに設定されている」の前にダウンロードコードを移動します。

それが不可能な場合は、ファイルを2回ダウンロードする必要があります。最初にその存在をテストします。そして後で再び実際にそれをダウンロードします。

ファイルの存在をテストするための偽のダウンロード:

echo "get myfile.txt /dev/null" | sftp -b - example.com
if [ $? -eq 0 ]
then
    echo "File exists"
else
    echo "File does not exist"
fi

テストとダウンロードの手順を1つに統合できる場合は、/dev/nullを実際のパスに置き換えます。


SFTPプロトコル自体は、ファイルの存在をテストできます。したがって、OpenSSH以外のSFTPクライアントが手元にある場合は、これをより簡単に実行できる可能性があります。

たとえば、 lftp には find コマンドがあります。

lftp -c "open sftp://example.com ; find myfile.txt"
if [ $? -eq 0 ]
then
    echo "File exists"
else
    echo "File does not exist"
fi

同様の質問については、 SFTPコマンドでファイルがダウンロードされたかどうかをテストする を参照してください。

1
Martin Prikryl