質問: ### 実現したいこと。 SFTPによりサーバーからファイルを取得する。 また、実行時はSSH認証からファイル取得まで自動実行する。 ### 制限事項 条件 仕様 クライアント:Linux サーバー:Linux ファイル取得方法:SFTP SSH認証方法:共通鍵認証 ファイル取得時の検索条件:testのファイル名を持つtxtファイル [仕様] 1 SFTP/GET コマンド実行前にサーバー側のファイルのサイズを確認する。 ※複数ファイル可能性あり 2 SFTP/GET コマンド実行後にGETしたクライアント側のファイルのサイズを確認する。 ※複数ファイル可能性あり 3 上記1 上記2のサイズを比較し異なる場合はエラーとし、クライアントのファイルを削除する。 比較が一致する場合はサーバー側のファイルをリネームし次回実行時に取得対象とならないようにする。 4 SFTP/QUIT を実行する ### 今私が考えている実現方法とソース例 シェルスクリプトで実現したいと考えています。 以下にソース例を貼り付けさせていただきます。 ※上記仕様の部分以外のソース例とさせていただいております。 ``` #!/bin/bash #実現性の確認 echo "SFTP start" # SFTP接続 sftp -i /Users/username/.ssh/id_rsa username@aa.bb.cc.dd << END cd sftp get test*.txt quit END echo "SFTP end" exit ``` ※Javaでの実現は可能であることはわかったのですがpureJavaでの実装が難易度が高いので それならシェルスクリプトでできないか検討しています。 ### 困っていること ●SFTP/GET実行前後におけるファイルサイズ取得方法がわからない SFTP/LS コマンドは準備されているのでファイルサイズを標準出力することは可能ですが その結果をクライアント側で取得する方法がわかりません。 SFTP/QUITした後にログかなんかに出力されたファイルサイズを取ってきて比較する方法しか ありませんでしょうか。 できれば、QUITする前に比較したいなと思っています。 以上です。どうか知恵をください。
回答: > > SFTP/LS コマンドは準備されているのでファイルサイズを標準出力することは可能ですが > > その結果をクライアント側で取得する方法がわかりません。 > > > sftpコマンドの実行を「リスト取得」と「ダウンロード」の二回に分けて、前者はファイルに出力。 リストファイルはawkなどで処理して、ファイル名とファイルサイズを取り出す。これをshellの連想配列の機能でまとめておく。 sftpの完了後、取得したファイルサイズを同様にローカルのlsで取得して、ファイルサイズを入れた連想配列と比較...。 というようなことを自分ならやると思います。最善手かはわかりませんが。