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

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

新規登録して質問してみよう
ただいま回答率
85.31%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Q&A

1回答

11423閲覧

シェルスクリプトでsftp接続し、転送結果を取得したい

退会済みユーザー

退会済みユーザー

総合スコア0

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

0グッド

1クリップ

投稿2022/04/27 08:06

編集2022/04/30 00:15

解決したいこと

ローカルサーバからsftp接続し、リモートサーバへローカルサーバのログファイルを転送するシェルスクリプトを作成しております。
その際に、ログファイルの転送結果をログ出力したいのですが、成功/失敗ステータスをログファイルに付与することは可能でしょうか。

ログ出力にて行いたい要件

・単一スクリプト
・ワンライナー
・処理開始時間 (日付/時間)
・転送状況
・転送結果(成功/失敗ステータス)

自分で試したこと

「$?」にて成功時には0, 失敗時には1のステータスを付与することが出来ると思い、「LOG1_PUT+="put $i"$'¥n'」箇所に追記したりしましたが下記のように認識され、意図通りに出力が出来ませんでした。
(転送されたログファイルがsample1.gzではなく0となってしまいます。)

log

12022-04-27 12:00 put /var/log/sample1.gz 0 22022-04-27 12:00 Uploading /var/log/sample1.gz to /log/$1/0

また、確認を込めて「cd /var/$1」箇所に「$?」を指定してみたところ失敗時にも0のステータスが渡されておりました。
参考記事を見ていると下記のような文言がありました。

OpenSSHのSFTPユーティリティは、失敗するとその呼出元へゼロ以外の終了ステータスを戻します。しかし、SFTP を呼び出しているのはあなたの CL プログラムではありません。Expect スクリプトが呼び出しているのです。したがって、Expect スクリプトがエラーを検出せず、CL プログラムにゼロを戻している場合、CL プログラムには何かが失敗したことを告げる術はありません。

これは、sftp(対話型)にてステータスを取得することは不可能ということでしょうか?
それともソースコードを少しひねることでステータスを取得することは可能でしょうか?

その他に関数を使用したログ出力方法を検討しましたが、sftpにて関数を呼び出すことが出来ず、リダイレクトを使用したログ出力方法を実装しました。

なるべく現状のソースコードを変えることなく実装したいのですが、自身の力量では解決できず、有識者様のご教授を頂けますと幸いです。
長くなり恐縮ですが、よろしくお願いいたします。

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

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

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

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

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

okakemetal

2022/04/27 08:16

sftp実行後に、echo $?で結果確認 sftpとcd の間で、echo $1など 一か所ずつ分解して確認されてみてはいかがでしょうか?
退会済みユーザー

退会済みユーザー

2022/04/27 08:30

@okakemetal様 ありがとうございます。 > sftp実行後に、echo $?で結果確認 > sftpとcd の間で、echo $1など sftpでechoコマンドが準備?されておらず、試した結果も下記のように何も出力がされませんでした。 ``` echo Invalid command ``` また、echoを付けず「cd /var/$1 $?」と指定すると、$1箇所が存在しても存在しなくても実行結果が「cd /log/$1 0」のように0が返ってくる状況です。。
sigsegv

2022/04/27 11:07 編集

>成功/失敗ステータスをログファイルに付与することは可能でしょうか。 この成功/失敗は、sftpで接続中に実行する「put」や「cd」の成功/失敗ですか? それとも sftpコマンドの成功/失敗ですか?(例えばサーバに接続できなかったなど)
退会済みユーザー

退会済みユーザー

2022/04/27 11:21

@sigegv様 ありがとうございます。 質問内容が明確になっておらず失礼いたしました。 > この成功/失敗は、sftpで接続中に実行する「put」や「cd」の成功/失敗ですか? こちらの「put」や「cd」の成功/失敗を想定しております。 > それとも sftpコマンドの成功/失敗ですか?(例えばサーバに接続できなかったなど) ただ、こちらのsftpコマンドの成功/失敗については、@kaz.Suenaga様から頂いた-vオプションにより取得出来ることは確認出来ました。 よろしくお願いいたします。
sigsegv

2022/04/27 11:43 編集

>こちらの「put」や「cd」の成功/失敗を想定しております。 put や cd の成功有無は「目視でしか分からない」のが仕様だと思います。 出力をログしているみたいないので、出力メッセージを解析すれば分かるかもしれませんが echo $? は使えません。 あと sftp の終了ステータスが $? で取れなかった件は、(-v で解決したみたいですが) ${PIPESTATUS[0]} を見るのが正しいです。
退会済みユーザー

退会済みユーザー

2022/04/27 12:21

ご確認頂きありがとうございます。 > put や cd の成功有無は「目視でしか分からない」のが仕様だと思います。 やはりsftpでは成功/失敗ステータスは取得出来ないですのね。。 関数等も使えないようですので、現状のログで判断するしかないのですね。 > sftp の終了ステータスが $? で取れなかった件 そのようにすることで確認出来るのですね! 知りませんでしたので、勉強になりました。 ありがとうございます!
guest

回答1

0

お求めの回答ではないとは思いますが、 sftpコマンドの -v オプションをつけてデバッグログ取得してはいかがでしょうか。

投稿2022/04/27 08:30

kaz.Suenaga

総合スコア2042

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

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

退会済みユーザー

退会済みユーザー

2022/04/27 08:44

@kaz.Suenaga様 ありがとうございます。 > sftpコマンドの -v オプションをつけてデバッグログ取得してはいかがでしょうか。 こちら存在は知っておりましたが、試せてはおりませんでした。 試しに-vオプションにて実行してみたところ、下記のようにステータスの表示はされました。 ``` 2022-04-27 12:00 quit *中略 2022-04-27 12:00 debug1: Exit status 0 ``` ただ、転送処理一つ一つに対してのステータスとはなっていないようなので(工夫することで可能?)、どうしても解決できなかった際には、こちらの方法も視野に入れたいと思います。
kaz.Suenaga

2022/04/27 10:15

`-v` を `-vv` とするともう少し深いデバッグログが出ます。 ( debug2 という段階が表示されます) 多分 `-vvv` まで詳細にできますので、それらで流用できるものがないか見てみてはいかがでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問