タグ: シェルスクリプト Page 1 of 5

Redmineのリマインダースクリプトをもう少し改良。

概要

Redmine標準で備わっているリマインダー。

締め切りが近いチケットを担当者に送付できる機能をcronで登録しています。これを更に改良です。

スクリプト

#!/bin/bash

# 引数でルートディレクトリを指定(デフォルトは/home/www-data/redmine)
REDMINE_ROOT=${1:-"/home/www-data/redmine"}

# 引数で日数を指定(デフォルトは3日)
DAYS=${2:-3}

# Redmineのルートディレクトリに移動
cd $REDMINE_ROOT

# リマインダーを送信
bundle exec rake redmine:send_reminders days=$DAYS RAILS_ENV=production

前は締め切り日数を

./redmine_reminder.sh 5

のように、引数で指定していました。新しいスクリプトでは

./redmine_reminder.sh /home/wwww-data/redmine2 5

と、同一サーバ上にある別Redmineでもルートディレクトリを指定できるようになっています。

後はこれを

20 8 * * * /home/hoge/scripts/redmine_reminder.sh /home/www-data/redmine2 31

など、crontabでの自動化を行いやすくしました。

MySQLのデータベースを暗号化してバックアップするスクリプト。

概要

以前も作成していた、MySQLのデータベースのバックアップを自動的に取得するスクリプトを少々リファインさせました。

変数指定により、複数のDBを任意にバックアップできます。

スクリプトの動き

  • サーバ内にあるDBのバックアップを取得し、暗号化して指定ディレクトリに保存します。
  • 複合化のパスワードはスクリプトが自動生成し、暗号化と同時に別ディレクトリに保存します。
  • cronの自動実行を前提としているため、古い暗号化ファイルと複合化のパスワードは一定期間後に削除を行います。

動作を確認したサーバ

  • Ubuntu 24.04
  • MySQL 8.0.39

前準備

アカウントファイル

任意のディレクトリに、db_account.txtといった、DBにユーザー名とパスワードを記したファイルを作成しておきます。

[client]
user = db_user
password = "password"
  • パーミッションは400にします。(chmod 400 db_account.txt)
  • 取り扱いは慎重に行ってください。

バックアップDBの格納先

  1. 冗長性があり
  2. 機密性が保たれる

場所を指定してください。筆者はクラウドストレージ(wasabi)をマウントしています。

パスワードの格納先

/home/hoge/dbrestore_password のように、複合化のパスワードを格納するディレクトリを作っておきます。
こちらも運用に合わせ、適切に保管ができる場所を指定します。

それぞれ、スクリプト実行アカウントがアクセス/実行できるものにします。

スクリプト

スクリプト内容

  • スクリプトファイル名(例)
    • mysql_db_backup.sh

変数などは間違いの無いように指定ください。

#!/bin/bash

## 変数ここから ##
# $HOMEの変数を指定します。
HOME_DIR="/home/hoge"
# SQLをバックアップするディレクトリ(保管先)を指定します。運用に合わせて指定ください。
backup_dir="/path/to/backup/directory"
# 保持するバックアップの世代を日数で指定します。
keep_days=7
# ファイルに付与する日付/作業ディレクトリ名/バックアップファイル名を指定します。
current_date=$(date +%Y%m%d)
backup_name="backup_mysql_${current_date}"
zip_file="backup_mysql.${current_date}.zip"
# アカウントファイルを指定します。運用に合わせて指定ください。
credentials_file="${HOME_DIR}/script/config/db_account/db_account.txt"
# パスワードを記録するファイル名を指定します。運用に併せてして指定ください。
password_dir="${HOME_DIR}/dbrestore_password"
password_file="${password_dir}/db-restore.${current_date}.txt"
# redmineのデータベース名を指定します。
database_name=database
# バックアップ時に指定するオプションを指定します。
options="--defaults-extra-file=$credentials_file --no-tablespaces --single-transaction"
# バックアップファイルのパターンを指定します。
backup_file_pattern="backup_mysql.*.zip"
# パスワードファイルのパターンを指定します。
password_file_pattern="*restore*.txt"
## 変数ここまで ##

## 処理ここから ##

# 1.アカウントファイルのパーミッションが400かどうかチェックします。
# 400以外は処理そのものを終了します。
permissions=$(stat -c "%a" "$credentials_file")
if [ "$permissions" != "400" ]; then
echo "アカウントファイルのパーミッションは400である必要があります。"
exit 1
fi

# 2.一時的なバックアップディレクトリを作成します。
mkdir "${backup_dir}/${backup_name}"

# 3. mysqldumpを実行してデータベースのバックアップを取ります。
mysqldump $options -h localhost $database_name > "${backup_dir}/${backup_name}/${backup_name}.sql"

# 4. パスワードによる暗号化を実施します。
password=$(openssl rand -base64 12)
cd "${backup_dir}/${backup_name}"
zip -r "${backup_dir}/${zip_file}" -P "$password" .
cd -

# 5. 一時的なバックアップディレクトリを削除します。
rm -rf "${backup_dir}/${backup_name}"

# 6. 解凍パスワードを指定ディレクトリに保存します。
echo $password > $password_file

# 7.パスワードの読み取り権限を600に変更します。
chmod 600 $password_file

# 8. 保持期間より古いバックアップファイルを削除します。
find "$backup_dir" -name "$backup_file_pattern" ! -type f -newermt "${keep_days} days ago" -delete
find "$password_dir" -name "$password_file_pattern" ! -type f -newermt "${keep_days} days ago" -delete

## 処理ここまで ##

作成後、

chmod +x mysql_db_backup.sh

で実行権を付与します。

スクリプトの動かし方

スクリプトの動き

./mysql_db_backup.sh

として実行すると、

  1. 変数で指定したアカウントファイルを読み込み、mysqldumpでバックアップを取ります。
  2. バックアップ作成後、パスワード付きzipファイルに圧縮します。
  3. 圧縮されたバックアップと複合化のためのテキストファイルを変数で指定したディレクトリに格納します。
  4. 変数で指定した期日が過ぎたバックアップファイルと複合化のためのテキストファイルは自動的に削除されます。

バックアップDBの解凍

unzip backup_mysql.yyyymmdd.zip

とすると、パスワードを尋ねられます。

db-restore.yyyymmdd.txtに表示された文字列を入力します。

または、

unzip -P $(cat /path/to/password_file.txt) /path/to/zip_file.zip -d /path/to/output_directory

でファイルを直接引数にして解凍することもできます。

cronの指定

動作を確認したら、

crontab -e -u hoge

でcron編集画面を出し、

0 2 * * * /home/hoge/script/directory/mysql_db_backup.sh

などとして指定すれば、日次のDBバックアップを取得可能です。

サーバにアクセスするIPアドレスの詳細を確認するシェルスクリプト。

Copilotを利用して、以下のスクリプトを抽出です。

  1. netstat -tan |grep ポート番号 を実行
  2. ポート番号は変数で指定可能
  3. IPアドレス一覧と件数を表示
  4. 詳細を表示しますか? → yの場合、IPアドレスが割り当てられている国やホストをIPアドレスごとに表示する
  5. 自分がアクセスしていることを考慮して、表示しないIPアドレスは変数で定義できるものとする
#!/bin/bash

# 定義された除外するIPアドレス(スペースで区切って指定可能)
EXCLUDE_IP="IPアドレスを入力"

# 使用するポート番号(スペースで区切って指定可能)
PORT="80 443"

# netstatを使用して指定されたポートに関連するIPアドレスを抽出
IP_LIST=$(netstat -tan | grep ":$PORT" | awk '{print $5}' | cut -d':' -f1 | grep -vE "($EXCLUDE_IP)" | sort | uniq)

# IPアドレスの件数を表示
echo "IPアドレス一覧:"
echo "$IP_LIST"
echo "件数: $(echo "$IP_LIST" | wc -l)"

# ユーザーに詳細表示を尋ねる
read -p "詳細を表示しますか? (y/n): " DETAIL

if [ "$DETAIL" = "y" ]; then
for IP in $IP_LIST; do
# whoisコマンドを使用してIPアドレスの詳細を取得
echo "IPアドレス: $IP の詳細:"
whois $IP | grep -E 'Country|OrgName' || echo "情報が見つかりませんでした。"
echo "-----"
done
else
echo "詳細表示はスキップされました。"
fi

前提としてwhoisコマンドがインストールされていることが条件。

これによって、

  • どこからアクセスしてくるのか
  • ホストの詳細はあるのか

の確認が可能です。

ChatGPTが作ったシェルスクリプトをBing(Copilot)が修正

以前にChatGPTが作成した天気予報スクリプト。

これをBing(Copilot)が改善・修正したらどうなるかという検証です。

修正前のスクリプト

#!/bin/bash

# ユーザーに都市名を尋ねる
echo "都市名を入力してください:"
read city

# ansiweatherコマンドを実行して天気情報を表示
echo "ansiweatherの情報:"
ansiweather -l "$city"

# curlコマンドを使用してwttr.inから天気情報を表示
echo "wttr.inの情報:"
curl wttr.in/"$city?lang=ja"

行うことは単純。プロンプトで都市名を尋ね、その都市の天気予報をansiweatherとwttr.inで表示させるというもの。

これを改善案を示して欲しいですと聞いてみました。

修正後のスクリプト

  • getweather.sh
#!/bin/bash

# 都市名をコマンドライン引数から取得するか、ユーザーに尋ねる
city=$1
if [[ -z "$city" ]]; then
echo "都市名を入力してください:"
read city
if [[ -z "$city" ]]; then
echo "都市名が入力されませんでした。"
exit 1
fi
fi

# ansiweatherコマンドを実行して天気情報を表示
echo "ansiweatherの情報:"
if ! ansiweather -l "$city"; then
echo "ansiweatherから情報を取得できませんでした。"
fi

# curlコマンドを使用してwttr.inから天気情報を表示
echo "wttr.inの情報:"
if ! curl -s "wttr.in/${city}?lang=ja"; then
echo "wttr.inから情報を取得できませんでした。"
fi

スクリプトの動き

対話式

./getweather.sh 

都市名を引数にする

./getweather.sh Paris

と、対話式でもコマンドからでも実行できるようになっています。この、都市を引数に指定することによって、他のシェルスクリプトにも転用できるのはいい改良案という形でした。

ChatGPTによるスクリプト修正。(通貨変換)

海外通販で、ドル円計算が面倒なのでスクリプト化。

以前、ChatGPTで作成した通貨変換スクリプトを、以下のようにChatGPT自身に修正してもらいました。

  1. CSVへの記録ではなく、○ドル◆円のように表示する。
  2. 通貨ペアの変換前の数値をプロンプトで尋ねる。(空白エンターは1)
  3. その数値で計算する。(例えば3ドル○円など)

修正した結果がこちらです。

スクリプト内容

  • currency_check.sh
#!/bin/bash

#### 変数定義ここから #####
# 通貨ペアの変換前の数値を取得する。
read -p "変換したい通貨の数値を入力してください(空白エンターは1): " conversion_factor
if [ -z "$conversion_factor" ]; then
    conversion_factor=1
fi

# 通貨ペアを変数化する。
# USDJPY=ドル円
# EURUSD=ユーロドル
# など、以下のURLに沿ったものを指定
base_currency="USD"
target_currency="JPY"
#### 変数定義ここまで ####

# 1. コマンドを実行してデータを取得し、標準エラー出力を/dev/nullにリダイレクトする。
data=$(wget -O - -U "" http://www.gaitameonline.com/rateaj/getrate 2> /dev/null)

# 2. 現在時刻を取得する。
date=$(date '+%Y/%m/%d')
time=$(date '+%H:%M')

# 3. 指定された通貨ペアの情報を取得する。
currency_data=$(echo "$data" | grep -o '{"high":"[0-9]*\.[0-9]*","open":"[0-9]*\.[0-9]*","bid":"[0-9]*\.[0-9]*","currencyPairCode":"'$base_currency$target_currency'","ask":"[0-9]*\.[0-9]*","low":"[0-9]*\.[0-9]*"}')

# 4. 必要な情報を取り出し、並び替える。
currencyPairCode=$(echo "$currency_data" | grep -o 'currencyPairCode":"'$base_currency$target_currency'"' | cut -d ':' -f 2 | tr -d '"')
open=$(echo "$currency_data" | grep -o 'open":"[0-9]*\.[0-9]*"' | cut -d ':' -f 2 | tr -d '"' | awk -v cf="$conversion_factor" '{printf "%'\''0.2f", $1 * cf}')
high=$(echo "$currency_data" | grep -o 'high":"[0-9]*\.[0-9]*"' | cut -d ':' -f 2 | tr -d '"' | awk -v cf="$conversion_factor" '{printf "%'\''0.2f", $1 * cf}')
bid=$(echo "$currency_data" | grep -o 'bid":"[0-9]*\.[0-9]*"' | cut -d ':' -f 2 | tr -d '"' | awk -v cf="$conversion_factor" '{printf "%'\''0.2f", $1 * cf}')
ask=$(echo "$currency_data" | grep -o 'ask":"[0-9]*\.[0-9]*"' | cut -d ':' -f 2 | tr -d '"' | awk -v cf="$conversion_factor" '{printf "%'\''0.2f", $1 * cf}')
low=$(echo "$currency_data" | grep -o 'low":"[0-9]*\.[0-9]*"' | cut -d ':' -f 2 | tr -d '"' | awk -v cf="$conversion_factor" '{printf "%'\''0.2f", $1 * cf}')

# 5. 結果を表示する。
echo "$date $time ${conversion_factor} $base_currency は $target_currency で以下の通りです。"
echo "始値: $open $target_currency"
echo "高値: $high $target_currency"
echo "売値: $bid $target_currency"
echo "買値: $ask $target_currency"
echo "安値: $low $target_currency"
  • 実行権付与
chmod +x currency_check.sh

動き

./currency_check.sh
変換したい通貨の数値を入力してください(空白エンターは1): 74
2024/03/13 14:25 74 USD は JPY で以下の通りです。
始値: 10,926.10 JPY
高値: 10,926.10 JPY
売値: 10,924.62 JPY
買値: 10,925.36 JPY
安値: 10,895.02 JPY

と、ブラウザを開くことなく結果が出るようになりました。

xmlフィードから最新の見出しを表示するスクリプト。

スクリプト概要

  1. BBCのRSSフィードをcurlする
  2. そこから指定の見出しを持ってくる

スクリプトの内容

  • bbc_headline.sh
#!/bin/bash

# セクションを指定
section="world"  # ここでセクションを変更

# BBC NewsのRSSフィードから見出しを取得
url="https://feeds.bbci.co.uk/news/${section}/rss.xml"
headlines=$(curl -s "$url" | grep -E '<title>' | sed -n 's/.*<title><!\[CDATA\[\(.*\)\]\]><\/title>.*/\1/p' | sed -n '2,4p')

# 見出しを表示
echo "BBC News - ${section} section"
echo "$headlines"
  • 実行権付与
chmod +x bbc_headline.sh

実行例

  • コマンド実行
./bbc_headline.sh
  • 表示結果
BBC News - world section
'We know what's coming': East Ukraine braces for Russian advance
Trump challenges Biden to TV debates 'anytime'
Australian charged over high-profile disappearance

コマンドベースでブラウザを実行するなく見出しだけでも確認できます。

対話式にLinuxサーバの再起動・停止を行うシェルスクリプト。

概要

メンテナンスなどで、指定する時刻にLinuxサーバを停止・再起動したいときは割合にあります。

そこで、そんなスクリプトです。

スクリプト内容

  • server_shutdown.sh
#!/bin/bash

# メッセージを表示して日付を入力
read -p "このサーバを停止・再起動する日付をyyyymmdd形式で入力してください: " input_date

# メッセージを表示して時刻を入力
read -p "このサーバを停止・再起動する時刻をhhmm形式で入力してください: " input_time

# メッセージを表示して再起動か停止かを入力
read -p "再起動は1、停止は2を入力してください(空エンターは1): " restart_option
restart_option=${restart_option:-1}  # デフォルトは再起動(1)

# 日付と時刻を結合
scheduled_datetime="${input_date} ${input_time}"

# オプションに応じてコマンドを設定
case $restart_option in
    1)
        action="再起動"
        ;;
    2)
        action="システム停止"
        ;;
    *)
        echo "無効なオプションが選択されました。スクリプトを終了します。"
        exit 1
        ;;
esac

# 確認メッセージを表示して、実行の可否を確認
read -p "$(date -d "$scheduled_datetime" '+%Y/%m/%d %H:%M') に$action します。よろしいですか?(y/n): " confirmation

if [ "$confirmation" == "y" ]; then
    # 指定した日時まで待機し、処理をバックグラウンドで実行
    (sleep $(( $(date -d "$scheduled_datetime" '+%s') - $(date '+%s') )) && {
        echo "システムに常駐し、指定日時に$action を行います。"
        if [ $restart_option -eq 1 ]; then
            shutdown -r now
        elif [ $restart_option -eq 2 ]; then
            shutdown -h now
        fi
    }) &
    disown  # バックグラウンドプロセスをデタッチ
    echo "処理をバックグラウンドで実行しました。プロンプトに戻ります。"
else
    echo "操作をキャンセルしました。"
fi

作成後、

sudo chown root:root server_shutdown.sh

として所有者をrootに変更。その後、

sudo chmod 744 server_shutdown.sh

で、rootのみに実行権を付与します。

実行時の動き

sudo bash server_shutdown.sh
このサーバを停止・再起動する日付をyyyymmdd形式で入力してください: 20240216
このサーバを停止・再起動する時刻をhhmm形式で入力してください: 0215
再起動は1、停止は2を入力してください(空エンターは1): 1
2024/02/16 02:15 に再起動 します。よろしいですか?(y/n): y
処理をバックグラウンドで実行しました。プロンプトに戻ります。

と、プロンプトが出て指定時刻にサーバーの再起動/停止を行います。

動きを止めたいとき

バックグラウンドで処理が走っているので、プロセスを確認して止めます。

  • プロセス確認
ps aux |grep server_shutdown
root        2202  0.0  0.0  11020  1528 ?        S    16:32   0:00 bash server_shutdown.sh

2202のように、PIDを確認します。

  • プロセス停止
sudo kill 2202

PIDに停止シグナルを送り、処理を止めます。

  • プロセス確認
ps aux |grep server_shutdown

該当するバックグラウンドの処理がなければ大丈夫です。

ChatGPTによるRubyスクリプト。(対話式パスワード生成)

前回作成したパスワード生成スクリプト。変数で指定するのはCron処理などでは便利でしたが、日常には不向き。

そこで、再びChatGPTに相談し、

以下の要件でスクリプトを作成です。

要件

  • スクリプトを実行する
  • 発行強度を1~3で指定する (空エンターは中)
    • 1:弱 8桁/英数字のみ
    • 2:中 10桁/小文字・大文字・英数字と単純な記号
    • 3.強 12桁/小文字・大文字・英数字と複雑な記号
  • 表示するパスワードの数を数字で指定する (空エンターは4個)

スクリプト

できあがったのがこちら。

  • password_generate.rb
def generate_password(length, complexity, password_count)
  case complexity
  when 1
    chars = [('a'..'z'), (0..9)].map(&:to_a).flatten
  when 2
    chars = [('a'..'z'), ('A'..'Z'), (0..9), ['!', '@', '#', '$', '%', '^', '&', '*']].map(&:to_a).flatten
  when 3
    chars = [('a'..'z'), ('A'..'Z'), (0..9), ['!', '@', '#', '$', '%', '^', '&', '*'], ['-', '_', '=', '+', '<', '>', '?']].map(&:to_a).flatten
  else
    puts "無効な発行強度です。"
    return
  end

  password_count.times do |i|
    password = (0...length).map { chars[rand(chars.length)] }.join
    puts "Password #{i + 1}: #{password}"
  end
end

def get_complexity
  print "発行強度を1から3の範囲で入力してください (デフォルトは2):\n"
  complexity_input = gets.chomp

  complexity = complexity_input.empty? ? 2 : complexity_input.to_i

  until (1..3).cover?(complexity)
    print "有効な範囲で入力してください(1から3): "
    complexity = gets.chomp.to_i
  end

  complexity
end

def get_password_count
  print "表示するパスワードの数を入力してください (デフォルトは4): "
  count_input = gets.chomp

  count = count_input.empty? ? 4 : count_input.to_i

  count
end

puts "パスワードを生成します。"
complexity = get_complexity
password_count = get_password_count

case complexity
when 1
  generate_password(8, complexity, password_count)
when 2
  generate_password(10, complexity, password_count)
when 3
  generate_password(12, complexity, password_count)
end

実行例

ruby password_generate.rb
発行強度を1から3の範囲で入力してください (デフォルトは2):
2
表示するパスワードの数を入力してください (デフォルトは4): 9
Password 1: ILAXRn!O47
Password 2: P^qmiduucK
Password 3: 8ytFezU%fU
Password 4: O!6OFeHgYe
Password 5: Ua&!Ryg039
Password 6: &T@AtiNpWy
Password 7: Jz8jyPbp#3
Password 8: HOWE66ki1I
Password 9: 9WRdsHhk*H

シェルスクリプト:秘密鍵を用いたLinuxサーバへのログインスクリプト。

概要

SSH接続しているLinuxクライアントから別のLinuxサーバにSSHログインする際の効率化を図るスクリプトです。

通常のコマンドを用いた秘密鍵を用いたアクセス

ssh -i /path/to/private_key username@server_host

と、-iの後に秘密鍵を指定し、ユーザ名@サーバ名/IPアドレスを入力するのはちょっと面倒なので、コマンド一発で接続できるようにします。

前提

  • Linuxサーバの秘密鍵を有していること。
  • 秘密鍵に適切なパスワードがかけられていること。

スクリプト

  • ssh_server.sh

serverの部分を任意のホスト名にすると便利です

#!/bin/bash

# 変数定義
## 接続先のサーバ名/IPアドレス
server_host="your_server_host"
## 接続先でログインするアカウント名
username="your_username"
## 秘密鍵のファイルパスを絶対パスで表記
private_key_path="/path/to/private_key"
## 接続時間を記録するログのディレクトリパスを絶対パスで表記
log_directory="/path/to/logs"


# ログディレクトリが存在しない場合は作成する
if [ ! -d "$log_directory" ]; then
    mkdir -p "$log_directory"
fi

# 現在の日付と時刻を取得
current_datetime=$(date +"%Y%m%d%H%M")

# ログファイルのパス
log_file="$log_directory/$server_host$current_datetime.log"

# 秘密鍵の存在チェック
if [ ! -f "$private_key_path" ]; then
    echo "$(date): Error - 秘密鍵ファイルが見つかりません: $private_key_path" >> "$log_file"
    exit 1
fi

# 秘密鍵のパーミッションが600であるかのチェック
if [ $(stat -c %a "$private_key_path") -ne 600 ]; then
    echo "$(date): Error - 秘密鍵のパーミッションが正しくありません (600 である必要があります): $private_key_path" >> "$log_file"
    exit 1
fi

# SSH接続
echo "$(date): SSH接続を試行します: ssh -i $private_key_path $username@$server_host" >> "$log_file"
ssh -i "$private_key_path" "$username@$server_host"
echo "$(date): SSH接続が正常に終了しました" >> "$log_file"
  • 実行権付与
chmod +x ssh_server.sh

動き

./ssh_server.sh

を実行後、秘密鍵のパスワード入力画面が出てきます。認証後、接続先のプロンプトが返ってくれば成功です。

Ubuntu : ディレクトリのバックアップスクリプト。

概要

Linux運用時、特定のディレクトリをバックアップするスクリプトです。

  1. バックアップ元とバックアップ先の変数指定
  2. 世代管理
  3. 直接実行するかCronで設定するか

の変数指定が可能です。

スクリプト内容

  • home_backup.sh

※要管理者権限

# 変数の定義
BACKUP_SOURCE="/home"
BACKUP_DEST="/backup"
GENERATION=3
VERBOSE=false  # バックアップ成功メッセージを表示するかどうか(true/false)

# 一時ディレクトリを作成
temp_dir=$(mktemp -d)

# バックアップを作成する関数
create_backup() {
    # yyymmdd形式の日付を取得
    DATE=$(date +"%Y%m%d")

    # 圧縮ファイルの名前を指定
    ARCHIVE_NAME="backup_$DATE.tar.gz"

    # rsyncを用いてディレクトリを一時ディレクトリにコピー
    rsync -a --delete "$BACKUP_SOURCE/" "$temp_dir/"

    # ディレクトリ全体を圧縮
    tar --ignore-failed-read -czf "$BACKUP_DEST/$ARCHIVE_NAME" -C "$temp_dir" .

    # 古いバックアップを削除
    delete_old_backups

    # メッセージの表示
    if [ "$VERBOSE" = true ]; then
        echo "Backup completed successfully."
    fi
}

# 古いバックアップを削除する関数
delete_old_backups() {
    # バックアップディレクトリ内のバックアップファイルを日付順にソート
    sorted_backups=($(ls -t "$BACKUP_DEST" | grep -E "backup_[0-9]{8}\.tar\.gz"))

    # 不要なバックアップファイルを削除
    while [ ${#sorted_backups[@]} -gt $GENERATION ]; do
        file_to_delete="${sorted_backups[${#sorted_backups[@]}-1]}"
        rm "$BACKUP_DEST/$file_to_delete"
        echo "Deleted old backup: $file_to_delete"
        # 削除したファイルをリストから除外
        sorted_backups=("${sorted_backups[@]:0:${#sorted_backups[@]}-1}")
    done
}

# バックアップの作成
create_backup

# 一時ディレクトリを削除
rm -r "$temp_dir"

作成後、実行権を付与します。

sudo chmod +x home_backup.sh

注意点

  • バックアップ先に十分な空き容量があることを想定しています。
  • rsyncとtarの二重処理なので、割と時間がかかります。

この辺をもう少しうまく処理したいです。

Page 1 of 5

Powered by WordPress & Theme by Anders Norén