タグ: Linux Page 4 of 26

Redmineに「いいね」機能を付与。

Redmineにソーシャルネットワークのように「いいね!」をつけるプラグインです。

環境

以下の環境で確認しています。

  • Ubuntu 24.04
  • Redmine 5.1
  • MySQL
  • Apache 2.4
  • Ruby 3.2

Redmine heartsインストール

  • Redmine プラグインディレクトリに移動
cd /path/to/redmine/root/directory/plugins

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

  • git clone
sudo -u www-data git clone --branch v3.0.0 --depth 1  https://github.com/cat-in-136/redmine_hearts

バージョンを指定したのは、本Redmineが4.2からアップデートしたこともあります。

  • マイグレーション
cd /path/to/redmine/root/directory/

Redmineのルートディレクトリに移動します。

 sudo -u www-data bundle exec rake redmine:plugins:migrate RAILS_ENV=production
  • Webサービス再起動
sudo systemctl restart apache2.service && echo $?

0が返ってくることを確認します。

  • 確認

設定後のRedmineにブラウザでアクセス。

いいね!欄がつけばOKです。

inotifywaitコマンドによるファイル書き換え状況の調査。

ちょっとした調査のためにinotifywaitを使ったので、そのメモです。

概要

inotifywait は、Linux の inotify インターフェースを利用してファイルやディレクトリの変更をリアルタイムで監視するコマンドです。これにより、ファイルの作成、削除、変更などのイベントを検知できます。

インストール方法

好みに応じてapt-getを利用します。

sudo aptitude install inotify-tools

基本的な使用例

特定のディレクトリ内でのファイル変更を監視する基本的な例です。

inotifywait -m /path/to/directory

このコマンドは、指定したディレクトリ内のファイル変更を監視し、変更があるたびにそのイベントを表示します。

特定のイベントを監視

特定のイベント(例: ファイルの修正)のみを監視する場合は、-e オプションを使用します。

inotifywait -m -e modify /path/to/directory

出力を tee コマンドでログに追記

監視結果をリアルタイムで表示しつつ、ログファイルに追記するには tee コマンドを使用します。

inotifywait -m /path/to/directory | tee -a /path/to/logfile.log

表示例

以下は、inotifywait コマンド実行時の表示例です。

inotifywait -m -e modify /path/to/directory
Setting up watches.
Watches established.
`/path/to/directory/modified_file.txt` MODIFY

この例では、/path/to/directory 内の modified_file.txt が修正されたことが検知されています。

tee コマンドを使用したログ追記例

監視結果をログファイルに追記する例を示します。以下のコマンドは、/home/mongodb ディレクトリ内での変更を監視し、イベントが発生するたびにその内容を mongodb_changes.log に記録します。

sudo inotifywait -m -e modify,create,delete /home/mongodb/ | tee -a mongodb_changes.log

実行例:

Setting up watches.
Watches established.
`/home/mongodb/` MODIFY index-143--5004584659078615538.wt
`/home/mongodb/` MODIFY WiredTiger.wt
`/home/mongodb/` CREATE WiredTiger.turtle.set
`/home/mongodb/` MODIFY collection-4--5004584659078615538.wt

このコマンドは、変更イベントをリアルタイムで表示するとともに、mongodb_changes.log にも追記します。

CSSの要素を表示するシェルスクリプト。

こういうさらっとしたツールを作る際にGTPは役立ちます。

興味でCSSをいじることがあり、どのCSSにどの要素が含まれているかを解析するためのコードを生成してもらいました。

スクリプト内容

  • css-inspector.sh
#!/bin/bash

# CSSファイルを引数として受け取る
if [ "$#" -ne 1 ]; then
  echo "Usage: $0 <css_file>"
  exit 1
fi

CSS_FILE="$1"

# ファイルが存在するか確認
if [ ! -f "$CSS_FILE" ]; then
  echo "Error: File '$CSS_FILE' does not exist."
  exit 1
fi

# CSS要素を抽出して解説する
awk '
BEGIN {
  print "CSS要素を抽出し、それぞれを解説します:\n"
}
{
  if ($0 ~ /\{/ || $0 ~ /\}/) {
    current_selector = $0
    gsub(/\{|\}/, "", current_selector)
    gsub(/^\s+|\s+$/, "", current_selector)
  }

  if ($0 ~ /font-size/) {
    print "font-sizeが見つかりました: テキストのサイズを指定します。セレクタ -> " current_selector ". 値 -> " $0
  }

  if ($0 ~ /background-color/) {
    print "background-colorが見つかりました: 要素の背景色を定義します。セレクタ -> " current_selector ". 値 -> " $0
  }

  if ($0 ~ /color:/) {
    print "colorが見つかりました: テキストの色を設定します。セレクタ -> " current_selector ". 値 -> " $0
  }

  if ($0 ~ /line-height/) {
    print "line-heightが見つかりました: テキスト行間のスペースを制御します。セレクタ -> " current_selector ". 値 -> " $0
  }

  if ($0 ~ /margin/) {
    print "marginが見つかりました: 要素の周囲の余白を定義します。セレクタ -> " current_selector ". 値 -> " $0
  }

  if ($0 ~ /padding/) {
    print "paddingが見つかりました: コンテンツとボーダー間の余白を定義します。セレクタ -> " current_selector ". 値 -> " $0
  }

  if ($0 ~ /border/) {
    print "borderが見つかりました: 要素のボーダーのスタイル、幅、色を指定します。セレクタ -> " current_selector ". 値 -> " $0
  }

  if ($0 ~ /width/) {
    print "widthが見つかりました: 要素の幅を設定します。セレクタ -> " current_selector ". 値 -> " $0
  }

  if ($0 ~ /height/) {
    print "heightが見つかりました: 要素の高さを設定します。セレクタ -> " current_selector ". 値 -> " $0
  }
}
END {
  print "\nCSS要素の抽出と解説が完了しました。"
}' "$CSS_FILE"

echo "\n完了しました!"

後は

スクリプト実行結果

chmod +x css-inspector.sh

として実行権を付与し、

./css-inspector.sh css_file

で解析します。

CSS要素を抽出し、それぞれを解説します:

font-sizeが見つかりました: テキストのサイズを指定します。セレクタ -> :root. 値 ->   --font-size: 1.1em; /* 1.1emで10%大きく */
font-sizeが見つかりました: テキストのサイズを指定します。セレクタ -> .issue, .description, .journal, .wiki. 値 ->   font-size: var(--font-size); /* 定義したサイズを適用 */
font-sizeが見つかりました: テキストのサイズを指定します。セレクタ -> code, pre. 値 ->   font-size: var(--font-size); /* ターミナル風のフォントでもサイズを変更 */

CSS要素の抽出と解説が完了しました。
\n完了しました!

さっくりとしたものですが、それでも、ターミナル上での視認性が良くなりました。

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 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. 以下のように「フルスクリーン有効化」ボタンが出ればインストール完了です。

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

続・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 4 of 26

Powered by WordPress & Theme by Anders Norén