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

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

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

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

解決済

シェルスクリプトでsftp接続し、ファイル転送を行いたい。

退会済みユーザー

退会済みユーザー

総合スコア0

bash

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

3回答

1評価

0クリップ

1659閲覧

投稿2022/01/20 02:18

編集2022/01/20 18:19

現在ローカルサーバのログファイルをsftp接続し、リモートサーバへ転送するシェルスクリプトを作成しております。
その際に、ローカルサーバによってディレクトリが存在するものと存在しないサーバがあります。
そこで、シェルスクリプトでディレクトリの存在チェックを行い、存在しないものはmputコマンドを実行しないようにしたいです。(サーバ毎に中身を変えることはしたくはないです。)
■仕様
・ログファイル転送元のサーバは複数存在します。
・ログは3日分のログを転送します。

現在のプログラム

#!/bin/bash # ローカルの3日分のファイルを変数に格納 LOG1=(`find /var/log/sample*.gz -mtime +0 -and -mtime -4`) LOG2=(`find /var/log/test/sample*.lgz -mtime +0 -and -mtime -4`) # SFTP接続 sftp -i /home/user/.ssh/id_rsa username@aa.bb.cc.dd << END cd /log/$1/ # LOG1の3日分のログを送信 mput ${LOG1[0]} mput ${LOG1[1]} mput ${LOG1[2]} # LOG2の3日分のログを送信 mput ${LOG2[0]} mput ${LOG2[1]} mput ${LOG2[2]} # SFTP切断 quit END

上記を実行したところ下記のようになります。

find: '/var/log/test/sample*.gz': No such file or directory Connected to aa.bb.cc.dd sftp> cd /var/server01/ sftp> # ↓LOG1に該当ファイルが格納されたため、実行できている。 sftp> mput /var/log/sample-20220119.gz Uploading /var/log/sample-20220119.gz to /log/server01/sample-20220119.gz /var/log/sample-20220119.gz 100% 1000 10.0MB/s 00:00 省略 # ↓LOG2に該当ファイルが格納されなかったため、叩く変数が存在しない。 sftp> mput You must specify at last one path after a mput command. 省略 sftp> sftp> quit

懸念点・自分で試したこと

現状困っている点は、3点です。
▼1点目
「find: '/var/log/test/sample*.gz': No such file or directory」のようにtestディレクトリが存在しない場合に変数に格納はされないが、エラーが出てしまう。
こちらをif文を使用し、回避しようと下記のように実装しました。

if [ LOG1=(`find /var/log/sample*.gz -mtime +0 -and -mtime -4`) ]; then echo "存在する" fi

そうすると、test文の中で()は使えないとのこと。

▼2点目
上記の問題が解決できた際に、sftp接続し、mputコマンドによってファイルを転送するのですが、

sftp> mput You must specify at last one path after a mput command.

のように転送はされないようになっているが、mputコマンド自体は叩いてしまっているので、1点目の存在チェックで存在しないと判定された場合、mputコマンドを実行しないようにしたい。
こちらもif文等で試してみましたが、そもそもsftpでif文は使えないのでは?と思い、詰まっている状況です。

▼3点目
現状3日分のファイルを転送するために、mputコマンドを3回ずつ叩くようにしているが、1回のmputコマンドで
3日分のログファイルを転送することが出来るか。
こちらは、mput ${LOG1[@]}など、忘れてしまいましたがその他にも試行錯誤は行いました。
上記の結果だと、下記のように認識されてしまいました。

mput /var/log/sample-20220119.gz , /var/log/sample-20220118.gz, /var/log/sample-20220117.gz

上記の問題について解決方法がお分かりの方がいらっしゃいましたらご教授頂けますと幸いです。
1点目、2点目、3点目全てご回答頂かなくても1つのご回答でも大変助かります。
よろしくお願いいたします。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

bash

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