WindowsSFTPサーバーからファイルをダウンロードするためのsh
スクリプトを書いています。ただし、その前に、ファイルが存在するかどうかを確認したいと思います。
Winexeをダウンロードしたり、ssh Host@host test -f file
やその他の方法を実行したりすることを提案する質問はたくさんありましたが、私の場合はすべてが機能しませんでした。私は何もインストールすることを許可されておらず、すぐに使えるユーティリティを使用する必要があります。
標準(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 -c "open sftp://example.com ; find myfile.txt"
if [ $? -eq 0 ]
then
echo "File exists"
else
echo "File does not exist"
fi
同様の質問については、 SFTPコマンドでファイルがダウンロードされたかどうかをテストする を参照してください。