カテゴリー: Linux Page 1 of 44

BBC Newsの見出しを取得するBashスクリプト・改良

概要

以前に書いたBBC Newsの特定のセクションから最新の見出しを取得するBashスクリプトを改良しました。Ubuntu 24.04で動作を確認しています。

必要なライブラリのインストール

このスクリプトを実行するには、xmllintが必要です。

sudo aptitude update
sudo aptitude install libxml2-utils

コード

bbc_headlin.sh

#!/bin/bash

# デフォルト値の設定
default_section="world"
default_count=3

# メインセクションのリスト
main_sections=("world" "uk" "business" "politics" "health" "education" "science_and_environment" "technology" "entertainment_and_arts")

# 引数の処理
if [[ "$1" =~ ^[0-9]+$ ]]; then
section=$default_section
count=$1
else
section=${1:-$default_section} # 引数1が指定されていない場合はデフォルト値を使用
count=${2:-$default_count}     # 引数2が指定されていない場合はデフォルト値を使用
fi

# メインセクションのURLの構築
if [[ ! " ${main_sections[@]} " =~ " ${section} " ]]; then
echo "Error: Invalid section '${section}'. Valid sections are: ${main_sections[*]}"
exit 1
fi

url="https://feeds.bbci.co.uk/news/${section}/rss.xml"

# BBC NewsのRSSフィードから見出しを取得
headlines=$(curl -s "$url" | xmllint --format - | grep -oP '(?<=<title>).*?(?=</title>)' | sed -n '3,'"$((count+2))"'p' | sed 's/<!\[CDATA\[//g' | sed 's/\]\]>//g')

# 見出しの表示
if [ -z "$headlines" ]; then
echo "No headlines found for section '${section}'. Please check the section name or try again later."
else
echo "BBC News - ${section} section (${count} headlines)"
echo "$headlines"
fi

作成後、

chmod +x bbc_headline.sh

としてスクリプトに実行権を与えます。

動作例

このスクリプトの動作例です:

デフォルトのセクション(world)から3つの見出しを取得する場合:

./bbc_headline.sh
  • 出力例:
BBC News - world section (3 headlines)
I hope Assad pays the price, says mother whose son's death inflamed 2011 Syrian revolution
Israel confirms attack on Syrian naval fleet
Another headline example

technologyセクションから5つの見出しを取得する場合:

./bbc_headline.sh technology 5
  • 出力例:
BBC News - technology section (5 headlines)
Tech company announces new product
Breakthrough in AI technology
Another tech headline
More tech news
Latest in technology

見出し数のみを指定する場合(デフォルトのセクションworldを使用):

./bbc_headline.sh 5
  • 出力例:
BBC News - world section (5 headlines)
I hope Assad pays the price, says mother whose son's death inflamed 2011 Syrian revolution
Israel confirms attack on Syrian naval fleet
Another headline example
More world news
Latest in world news

利用可能なセクション

利用可能なセクション
スクリプトで指定できるセクションは、以下の通りです:

  • world: 世界のニュース
  • uk: イギリス国内のニュース
  • business: ビジネス関連のニュース
  • politics: 政治関連のニュース
  • health: 健康関連のニュース
  • education: 教育関連のニュース
  • science_and_environment: 科学・環境関連のニュース
  • technology: テクノロジー関連のニュース
  • entertainment_and_arts: エンターテインメント・アート関連のニュース

メインセクション及び見出し数を引数として利用できるのが改善点です。

snipe-itでのDBマイグレーションエラー(プロフィール画像の更新時にエラー)に対処。

Ubuntu 20.04→Ubuntu24.04にデータ移行を行った資産管理ツールsnipe-it。

その後、バージョンアップを行いましたが、それに伴うDBの不整合が問題でエラーが発生しました。

こちら、メモとして残します。

環境

  • Ubuntu 24.04
  • php 8.3
  • MySQL 8.0.40
  • Apache 2.4
  • Snipe-IT v7.0.12

発生したエラー

自分のアカウントの画像を変更しようとしたところ、500 internal server errorが発生しました。

エラーの特定

  • snipe-itのログディレクトリに移動
cd /home/www-data/snipe-it/storage/logs
  • ログ確認
cat laravel.log |grep ERROR
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'enable_sounds' in 'field list'

プロファイルの編集にこのような機能があったことから、DBのusersテーブルにenable_soundsenable_confetti列が存在しないことが原因で、画像変更時にSQLエラーが発生したと考えられます。

調査

このエラーが原因と考え、まずはsnipe-itのルートディレクトリに移動。

cd /home/www-data/snipe-it

artisan migrateを実行。

sudo -u www-data php artisan migrate

以下のエラーが見つかりました。

SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'accessories_checkout' already exists

対処を行います。

対処

MySQLでの対処

  • MySQLログイン
mysql -u snipeit -p snipeit
  • DB切り替え
USE SNIPEIT;
  • テーブル確認
SELECT * FROM migrations WHERE migration = '2024_07_26_143301_add_checkout_for_all_types_to_accessories';

→ 結果: Empty Set このため、これが記録されていないことが分かりました。

  • 該当テーブルの構造確認
DESCRIBE accessories_checkout;

→ テーブルが既に存在しています。

このことで、マイグレーションをスキップして対応することにしました。

  • マイグレーションスキップ
INSERT INTO migrations (migration, batch) VALUES ('2024_07_26_143301_add_checkout_for_all_types_to_accessories', 1);
  • MySQLログアウト
exit

phpでの対応

  • snipe-itのルートディレクトリ確認
cd /home/www-data/snipe-it && pwd

/home/www-data/snipe-itを確認

  • 改めてのDBマイグレーション
sudo -u www-data php artisan migrate
  • マイグレーション結果
2024_08_06_175114_add_shortcuts_enabled_to_settings_table ......................................................... DONE
2024_08_07_204014_add_play_sounds_to_profile ..................................................................... DONE
2024_08_15_111816_add_confetti_to_users .......................................................................... DONE
2024_08_16_104137_add_due_checkin_days_to_settings ............................................................... DONE

今度はマイグレーションが通ったことを確認です。

  • 結果反映
sudo -u www-data php artisan config:clear
sudo -u www-data php artisan cache:clear
sudo -u www-data php artisan view:clear
  • Webサービス再起動
sudo systemctl restart apache2.service && echo $?

0と表示されれば正常に再起動しています。

対処完了確認

ブラウザでsnipe-itにアクセスし、画像がアップロードされることが確認できたので、対処完了です。

Redmine View Customizeを用いて、alt属性がついた画像を拡大して表示する。

こちらの記事の応用となります。

のように、alt属性がついた画像をマウスオーバーしたときに

拡大表示させます。

前提

  • Redmine View Customize がインストールされていること。
  • Redmine 5.1で動作を確認しています。

手順

画面移動

  1. Redmineに管理者権限でログインします。
  2. 管理>表示のカスタマイズに移動します。

カスタマイズ作成:JavaScript

表示のカスタマイズに移動後、「新しい表示のカスタマイズ」をクリックします。

以下の通りに入力します。

  • パスのパターン
  • 空白
  • プロジェクトのパターン
  • 空白
  • 挿入位置
  • 全ページのヘッダ
  • 種別
  • JavaScript

コード

// JavaScript部分
$(document).ready(function() {
$('img[alt]').hover(
function() {
$(this).css({
'transform': 'scale(1.5)',
'transition': 'transform 0.3s ease'
});
},
function() {
$(this).css('transform', 'scale(1)');
}
);
});

// CSS部分
var style = document.createElement('style');
style.innerHTML = `
img[alt] {
transition: transform 0.3s ease;
}
`;
document.head.appendChild(style);
  • コメント
  • 任意「alt画像のホバー表示(javascript)」など
  • 有効
  • チェック
  • プライベート
  • チェックを外す

設定後、保存をクリックします。

動作を確認します。

上記設定後、チケット詳細などのアイコンが表示されているページに遷移します。

冒頭のようにマウスカーソルを近づけた際に拡大されれば設定は完了です。

Redmine View Cutomizeを用いてアイコンを拡大表示させる。

概要

アイコンの画像にマウスを近づけたとき、

アイコンを拡大表示させるためのView_Customizeのスクリプトです。

前提

  • Redmine View Customize がインストールされていること。
  • Redmine 5.1で動作を確認しています。

手順

画面移動

  1. Redmineに管理者権限でログインします。
  2. 管理>表示のカスタマイズに移動します。

カスタマイズ作成:JavaScript

表示のカスタマイズに移動後、「新しい表示のカスタマイズ」をクリックします。

以下の通りに入力します。

  • パスのパターン
  • 空白
  • プロジェクトのパターン
  • 空白
  • 挿入位置
  • 全ページのヘッダ
  • 種別
  • JavaScript

コード

$(document).ready(function() {
// gravatarクラスを持つ画像にホバーイベントを追加
$('img.gravatar').hover(
function() {
$(this).css({
'transform': 'scale(1.5)', // 拡大率
'transition': 'transform 0.3s ease' // 拡大のスムーズなアニメーション
});
},
function() {
$(this).css({
'transform': 'scale(1)', // 元のサイズに戻す
'transition': 'transform 0.3s ease' // 縮小のスムーズなアニメーション
});
}
);
});
  • コメント
  • 任意「アイコンのホバー表示(javascript)」など
  • 有効
  • チェック
  • プライベート
  • チェックを外す

設定後、保存をクリックします。

カスタマイズ作成:CSS

表示のカスタマイズに移動後、「新しい表示のカスタマイズ」をクリックします。

以下の通りに入力します。

  • パスのパターン
  • 空白
  • プロジェクトのパターン
  • 空白
  • 挿入位置
  • 全ページのヘッダ
  • 種別
  • CSS

コード

/* gravatarクラスを持つ画像のスタイル */
img.gravatar {
transition: transform 0.3s ease; /* スムーズなアニメーション */
cursor: pointer; /* ポインタを表示 */
}
  • コメント
  • 任意「アイコンのホバー表示(CSS)」など
  • 有効
  • チェック
  • プライベート
  • チェックを外す

設定後、保存をクリックします。

動作を確認します。

上記設定後、チケット詳細などのアイコンが表示されているページに遷移します。

冒頭のようにマウスカーソルを近づけた際に拡大されれば設定は完了です。

Redmine 5.1にWikiエディタのフルスクリーンモードを追加するプラグイン。

概要

RedmineのWiki編集ページを他のマークダウン対応エディタのようにフルスクリーンモードを追加します。

動作を確認した環境

  • Ubuntu 22.04 / 24.04
  • Redmine 5.1
  • Apache 2.4

さっくりとした手順

  1. Redmineのプラグイン配置ディレクトリに移動します。
  2. git cloneを行います。
  3. Webサービスを再起動します。
  4. 動作を確認します。

Redmine プラグイン配置ディレクトリに移動

cd /home/www-data/redmine && pwd

自分の環境に合わせます。

プラグインインストール

  • git clone
sudo -u www-data git clone https://github.com/sk-ys/redmine_wiki_fullscreen_editor
  • clone 確認
ls -ld redmine_wiki_fullscreen_editor

ディレクトリがあることを確認します。

Webサービス再起動

sudo systemctl restart apache2.service

動作確認

  1. Redmineに管理者権限でログインします。
  2. チケットやコメント編集など、任意のWiki編集画面を表示させます。
  3. 以下のように「フルスクリーン有効化」ボタンが出ればインストール完了です。

終わらせるときは右上の「フルスクリーン無効化」をクリックすれば解除できます。

Wasabi障害切り分け。

障害報告

2024/11/30 9:00頃 ~ 2024/11/30 11:20

筆者が運営しているサイト

で画像が見られない事象が発生しました。

原因

Wasabiクラウドストレージの全リージョンのネットワークトラブル。

原因追及の切り分け

「Webサイトにアクセスできるのに画像が表示されない」でした。

WebArena にs3プロトコルでwasabiクラウドストレージにマウントしており、

df -h

を行ってもマウント情報が見られなかったためです。

念のため

sudo umount /mnt/wasabi && sudo mount -a

を実行しましたがマウントされず。

次に、Webコンソールにログインを試み、何か情報があるかを確認。

→ ログインそのものができませんでした。

そこで思ったことは

  • 何らかの理由でWasabiクラウドストレージに障害が発生
  • 自分のアカウントが無効化された

の2つ。情報を見るためTwitterで検索をしたら、自分と同じような状況に陥っているアカウントを見つけて、前者であると判断。

そこから30分後。

https://status.wasabi.com

で全域での障害を確認しました。

後は復旧を待つだけという状態。

復旧後の確認

sudo umount /mnt/wasabi && sudo mount -a
df -h

でマウントされていることを確認。

念のため

sudo systemctl restart apache2.service

を行って冒頭の2サイトにアクセス。

画像が見られることを確認しました。

サーバ全体のストレージを安価なクラウドストレージにしていることが災いしました。

オフラインバックアップなどを考慮したいところです。

続・Ubuntuで特定のディレクトリに移動した際にカスタムメッセージを表示する。

こちらの記事に更に処理を付け加えました。

  • /etc/profile.d/cd.sh
# カスタムcd関数を定義
cd() {
# ビルトインcdコマンドの実行
builtin cd "$@" || return

# PWDに基づいて処理を実行
case "$PWD" in
"/etc/apache2/sites-available")
echo "注意: .confファイルのバックアップを取ること"
;;
"/var/log" | "/var/log/"*)
echo "注意: ログファイルを定期的にチェックすること"
;;
# 任意の作業ディレクトリを追加
"/home/hoge/work")
echo "作業ディレクトリに移動しています..."
new_dir="$(date +%Y%m%d)"
mkdir -p "$new_dir" && builtin cd "$new_dir"
;;
*)
# 他のディレクトリでは何もしない
;;
esac

# 現在のディレクトリを表示
pwd
}

付け加えた機能は

  • cd コマンド実行時、pwdを追加で行う。
  • /var/log 配下全てのディレクトリで 「注意: ログファイルを定期的にチェックすること」と表示されるようにしたこと。
  • 任意の作業ディレクトリに遷移した際、自動的にyyyymmdd形式のディレクトリを作り、更にそのディレクトリに移動する。

後は

sudo chmod +x /etc/profile.d/cd.sh
source /etc/profile.d/cd.sh

とすれば、運用時の注意点や作業ディレクトリの自動作成まで行ってくれます。

Ubuntuで特定のディレクトリに移動した際にカスタムメッセージを表示する。

概要

Ubuntuで、特定のディレクトリに移動した際にカスタムメッセージを表示するTIPSです。

例えば、cd /etc/apache2/sites-availableとしたときに「.confファイルのバックアップを取ること」といった確認メッセージを表示させることができます。

環境a

  • Ubuntu 22.04 /24.04
  • BashまたはZshシェル

手順

1. スクリプトを作成

まず、/etc/profile.d/cd.shにカスタムcd関数を追加します。

sudo tee -a /etc/profile.d/cd.sh > /dev/null << 'EOF'
# カスタムcd関数を定義
cd() {
# ディレクトリに移動
builtin cd "$@"

# 特定のディレクトリに移動したときのメッセージ
case "$PWD" in
"/etc/apache2/sites-available")
echo "注意: .confファイルのバックアップを取ること"
;;
"/var/log")
echo "注意: ログファイルを定期的にチェックすること"
;;
*)
# 他のディレクトリの場合は何もしない
;;
esac
}
EOF

2. スクリプトに実行権限を付与します。

sudo chmod +x /etc/profile.d/cd.sh

3. スクリプトを反映

source /etc/profile.d/cd.sh

動作確認

設定が正しく反映されているか確認するために、特定のディレクトリに移動してみます。

cd /etc/apache2/sites-available

注意: .confファイルのバックアップを取ることと表示されることを確認します。

cd /var/log

注意: ログファイルを定期的にチェックすることと表示されることを確認します。

スクリプト修正ポイント

ディレクトリの追加:

新しいディレクトリに対してメッセージを表示させたい場合は、case文に新しい条件を追加します。

メッセージの変更:

各ディレクトリに対するメッセージを変更する場合は、echoコマンドの内容を編集します。

case "$PWD" in
"/new/directory/path")
echo "新しいディレクトリに移動しました"
;;
# 他のディレクトリの条件を追加
esac

これで、特定のディレクトリに移動したときにカスタムメッセージを表示する方法が設定できました。

Ubuntu24.04のauth.logから不正ログイン試行を確認するワンライナー。

Ubuntu 24.04でWebサーバを公開中。

/var/auth.logから、失敗したアクセス(認証に失敗したユーザー)を確認するためのワンライナーです。

  • コマンド
sudo awk '/Disconnected from invalid user/ {print $(NF-4)}' /var/log/auth.log | sort | uniq -c | sort -nr
  • 実行結果
43 root
36 ubuntu
24 user
20 test
13 admin
8 deploy
6 guest
6 ftpuser
5 oracle
5 hadoop
5 dev
5 debian
4 user1
4 sysadmin
4 samba
3 test1
3 mysql
3 max
3 kafka

と、アカウントごとに失敗したユーザーを表示してくれます。

成功したログインを日付時刻を付与した上で表示する

/var/auth.logから、ログインに成功したユーザーを調べます。

  • コマンド
sudo awk '/Accepted/ {split($1, date, "T"); split(date[2], time, "."); gsub("-", "/", date[1]); print date[1] " " substr(time[1], 1, 5) " " $7}' /var/log/auth.log | sort | uniq -c | sort -nr

日付は2024-11-25T16:21:14.772402+09:00のような形式から2024/11/25 14:38に修正しています。ログの形式が異なる場合は調整が必要です。

  • 実行結果
1 2024/11/25 14:38 hoge

これで、ログの視認性が高まりました。

UbuntuサーバのSSHセキュリティ周りを強化。

SSHの不正アクセス対策としてfail2banを入れています。とはいえ、これがマシンリソースを喰うので根本的な設定を行いました。

環境

  • Ubuntu 24.04

作業の前に

SSHを前提としているサーバの場合は

  • 直接コンソールで切り戻しができるようにしておく
  • VPS等はスナップショットでリカバリができるようにする

ことが大前提です。

また、鍵交換での手順です。パスワード認証でこの設定を行うと接続ができなくなります。

さっくりとした手順

  1. SSHの設定ファイルのバックアップを取ります。
  2. 設定を変更します。
  3. 設定を反映し、確認を行います。

設定ファイルのバックアップ

sudo cp -pi /etc/ssh/sshd_config /path/to/backup/directory/sshd_config.$(date +%Y%m%d)

任意のバックアップディレクトリを指定します。

ファイルのバックアップ確認

diff -u /path/to/backup/directory/sshd_config.$(date +%Y%m%d) /etc/ssh/sshd_config

エラーがなければ(差分がなければ)バックアップできています。

sedによるファイル書き換え

echo -e "\nPermitRootLogin no\nPasswordAuthentication no\nAllowUsers user1" | sudo tee -a /etc/ssh/sshd_config

user1の部分は「実際にSSH接続を行うアカウント」を指定します。

user1 user2

のように、スペースで区切って複数のアカウントを指定することが可能です。

ファイル書き換え確認

diff -u /path/to/backup/directory/sshd_config.$(date +%Y%m%d) /etc/ssh/sshd_config

以下のような差分を確認します。

+PermitRootLogin no
+PasswordAuthentication no
+AllowUsers user1
  • rootのログインを禁止する
  • パスワード認証を禁止して鍵交換方式のミニする
  • user1のみアクセス可能にする

設定反映

SSH接続で修正をしている場合、別にターミナルクライアントを立ち上げておきます。

sudo systemctl restart ssh.service

設定反映確認

  1. 新たにターミナルクライアントを立ち上げて、指定したユーザーでログインできること
  2. 指定していないユーザーではログインできない
  3. rootでのログインはできない
  4. パスワード認証ができない

ことを確認します。また、

sudo reboot

を行い、サーバ再起動でも同じ挙動を確認します。

接続できない場合の切り戻し

スナップショットからイメージを復元します。

または、直接コンソールを開き、

sudo cp -pi /path/to/backup/directory/sshd_config.$(date +%Y%m%d) /etc/ssh/sshd_config

として設定を切り戻し、

sudo systemctl restart ssh.service

を実施します。

Page 1 of 44

Powered by WordPress & Theme by Anders Norén