質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

2回答

22090閲覧

シェルスクリプトによるSFTP

horse

総合スコア10

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

0クリップ

投稿2019/04/14 04:59

実現したいこと。

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する前に比較したいなと思っています。

以上です。どうか知恵をください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

sftpコマンドでアクセスしているということは、sshでログイン可能だと思いますので、
sshコマンドを使用してアクセスすればよいと思います。

sh

1sftp -i /Users/username/.ssh/id_rsa username@aa.bb.cc.dd << END 2cd sftp 3get test*.txt 4quit 5END

相当の処理の前に、以下のようにしてファイルリストを取得できると思います。

sh

1list=$(ssh -i /Users/username/.ssh/id_rsa username@aa.bb.cc.dd ls -l ~/sftp)

投稿2019/04/14 11:46

fu7mu4

総合スコア1088

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

SFTP/LS コマンドは準備されているのでファイルサイズを標準出力することは可能ですが
その結果をクライアント側で取得する方法がわかりません。

sftpコマンドの実行を「リスト取得」と「ダウンロード」の二回に分けて、前者はファイルに出力。

リストファイルはawkなどで処理して、ファイル名とファイルサイズを取り出す。これをshellの連想配列の機能でまとめておく。

sftpの完了後、取得したファイルサイズを同様にローカルのlsで取得して、ファイルサイズを入れた連想配列と比較...。

というようなことを自分ならやると思います。最善手かはわかりませんが。

投稿2019/04/14 07:04

otolab

総合スコア767

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問