それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

IPアドレスが、サブネットに含まれるか判定する( python )

python で ip address がネットワークに含まれるか計算したい

このIP 209.85.220.73 この、ネットワーク 209.85.128.0/17 に入るんだっけ。

計算してみる

python の netaddr パッケージを用いて計算する

pip install netaddr
##または pipenv 経由で
pipenv run pip install netaddr

要は、ふたつのIPのネットワークアドレスが一致すればいいわけですからこうすればいい。

from netaddr import * 

a = IPNetwork("209.85.220.73/17")
a.network # => IPAddress('209.85.128.0')
b = IPNetwork("209.85.128.0/17")
b.network # => IPAddress('209.85.128.0')
a.network ==  b.network

ショートカットに

これ、もうワンライナーで動きそうですね。

python -c "import sys;from netaddr import *; \
 
print( \
 IPNetwork(sys.argv[1]).network
  ==  IPNetwork(sys.argv[2]).network) \
" 209.85.220.73/17 209.85.128.0/17

だったら alias でいけるか。

alias in_subnet='python -c "import sys;from netaddr import *; print(IPNetwork(sys.argv[1]).network ==  IPNetwork(sys.argv[2]).network)" '

in_subnet 209.85.220.73/17 209.85.128.0/17

サブネットの計算は暗算できたほうが嬉しい

サブネットが一致するかの計算って、だいたいパターンなので暗算できるんだけど。

たとえば次のようにする。

209.85.220.73/17 を計算するに、

209.85.220.73/17 → 16+1 
209.85.0.0/16 + 220/1 + 0
209.85.0.0/16 + 128 + 0
209.85.0.0/16 + 0.0.128.0 + 0.0.0.0
だから
209.85.220.73/17 → 209.85.128.0/17

範囲もそこから想像がつく

209.85.128.0/17  →  209.85.128.0 ~ 209.85.255.255

なので、209.85.220.73は範囲に含まれる。

これは、つぎの表を丸暗記しておけば、サクッと計算できるわけで。

マスク 1オクテット 2オクテット 3 オクテット 4オクテット
/32 8 8 8 8
/24 8 8 8 0
/16 8 8 0 0
/8 8 0 0 0

IPアドレスのオクテット

1 2 3 4 5 6 7 8
7 6 5 4 3 2 1 0
128 64 32 16 8 4 2 1

これを覚えておけば、だいたい計算できるわ

たとえば、/26の場合

26=24+2 なので、24 までの /255.255.255.0 までは変換しないとわかる。残りの2相当つまり、 0.0.0.64 の足し算だとわかる。

たとえば、 /17 の場合

17 の場合は、16+1 なので、16までの /255.255.0.0 は変換しないとわかる。残りの1相当つまり、 128 が以降がネットワークアドレスとわかる。

209.85.128.0/17 の場合

209.85.128.0/17 
→ 209.85.128.0/16+1
→ 209.85.0.0/16 + 0.0.128.0
→ 209.85.128.0

209.85.220.73/17の場合

209.85.220.73/17
→ 209.85.220.73/(16+1)
→ 209.85.0.0/16 + 0.0.220.73/17
→ 209.85.0.0/16 + 0.0.128.0
→ 209.85.128.0

はたして、暗算での判断と、計算機を用いた場合のどちらが速いんだろう。

journald で今日のログ だけを見たい

今日のログだけを見る

日付を指定して、ログが見れる。

journalctl --since 2021-07-12

もっとかんたんに

date コマンドと組み合わせれば、ぱぱっと実行できますね。

journalctl --since $(date -I)

今日の 17:00 以降ログ

時間も合わせて、さっきのログをみたいと。日付と時刻を合わせて、最新のログだけをみる。

journalctl --since "$(date -I) 17:00:00"

参考資料

https://www.codeflow.site/ja/article/how-to-use-journalctl-to-view-and-manipulate-systemd-logs

Ubuntuでmysql(/var/lib/mysql)を初期化して初期パスワード生成

mysql をリセットする

apt でインストールしたmysql のデータを全消しして、初期化し直す。

mysql を消したくなるとき。

何らかの作業をしていて、いったんmysql をサクッと削除して作り直したい時がある。

しかし、apt はしたくない。

sudo apt purge mysql.server
sudo apt purge mysql

コンテナを使っていると、消去して再インストールしたいが、aptからやり直すと不便。たとえば、次のようなとき。

docker でボリュームを設定したとき

たとえば、docker ubuntumysql を apt インストールしたものを ボリュームで外部と共有するとき。

VOLUME ['/var/lib/mysql']

このとき、docker run -v ./mysql:/var/lib/mysql などととやると、MySQLの初期データが完全に消えて起動しなくなる。

ubuntu をそのままに、mysql を消したいとき

apt で再インストールすればいいのだろうが。バージョンはそのままで管理ファイルをまっさらにしたいとき。 インストールスクリプトを作っているときなど

ネット接続無しで初期化したい。

パスワードがわからないので初期化したい。でもインターネットに接続できない(接続設定してない)のでapt で再インストール出来ない

apt remove / apt install は事情により出来ない。このときにmysqlのデータフォルダだけを再初期化してrootパスワードを再発行できる。

mysql を初期化する、

次のコマンドを使えば、インストールされているMySQLはそのままに、データの格納ディレクトリを再初期化できる。

mysqld --initialize

mysql を /var/lib/mysqlに入れた場合は、次のコマンドで再初期化ができる。

sudo systemctl stop mysql
sudo rm -rf /var/lib/mysql/*
sudo mysqld --initialize
sudo systemctl start mysql

この手順は、apt install mysql されたものをデータベースの保存ディレクトリだけを初期化し直すに使える。

初期化後の作業:パスワード再設定。

初期化コマンド mysqld --initialize は、root@localhostmysql パスワードも初期化されているので、パスワードを再設定する。

先程の初期化コマンド mysqld --initialize実行後に、ランダムなパスワードで初期化されている。ランダムパスワードが生成されているんで注意する。

初期化後の初回パスワードの確認

初期化パスワードを確認する。ログに書かれている。

# cat /var/log/mysql/error.log  | grep -i pass

実際にやった例

root@1626170b71af:/# cat /var/log/mysql/error.log  | grep -i pass
2021-06-22T08:34:32.575385Z 1 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
2021-06-22T08:34:40.773077Z 0 [Note] Shutting down plugin 'sha256_password'
2021-06-22T08:34:40.773089Z 0 [Note] Shutting down plugin 'mysql_native_password'
2021-06-22T08:34:43.290236Z 0 [Note] Shutting down plugin 'sha256_password'
2021-06-22T08:34:43.290244Z 0 [Note] Shutting down plugin 'mysql_native_password'
2021-07-12T08:39:58.067661Z 1 [Note] A temporary password is generated for root@localhost: mGUTPx0fyXSx

パスワードを再設定

初期パスワードはそのままでは使えません。

実行時に You must reset your password と言われて怒られます。

ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

実際に怒られている例。

root@1626170b71af:/# mysql -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.34-0ubuntu0.18.04.1

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>  use mysql;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

パスワード再設定

rootユーザーでログインしたあと

mysql -p 

パスワードを再設定のALTER TABLEを発行する。

ALTER USER 'root'@'localhost' IDENTIFIED  BY 'MYSQL_ROOT_PASSWORD';

まとめ

  • MySQLのデータフォルダ削除 rm /var/lib/mysql
  • 初期化コマンド mysqld --initialize
  • 生成パスワード確認 cat /var/log/mysql/error.log | grep -i pass
  • 初期パスワード変更 ` ALTER USER 'root'@'localhost' IDENTIFIED BY 'MYSQL_ROOT_PASSWORD'| mysql -p '

これで、いつでもMySQLを初期化してサクッとつくって使い潰せる。

docker-compose で mysql だけのインスタンスを立ち上げなくても、全部入りdocker を作って開発環境を無精できる。

参考資料

https://stackoverflow.com/questions/8911115/how-to-recover-recreate-mysqls-default-mysql-database https://serverok.in/you-must-reset-your-password-using-alter-user