はじめに
こんにちは。Hagianです。現在大学院の修士2年です。表題のとおり、「特定回線に接続しているときのみ、ターミナル周りを一括更新するコマンドを実装」してみたので 自己満足で 備忘録的に記事を書きます。
きっかけ
- Pythonのライブラリ、Homebrewのformulaを頻繁に更新したいが、かなり通信量を必要とすることが多い
↓
- できれば通信量を気にせず使える回線で更新したい
↓
- 大学にいるとき のみ 更新すればいいのでは?
やりたいこと
- Homebrewのupgradeと、pipを使ったライブラリの更新を一括でする
- 大学の居室のWi-Fiに接続しているときのみ実行させる
環境
- MacBook Pro(M1, 2020)
- macOS Ventura 13.4
- Z shell 5.9
- Python 3.11.4
実装
参考にしたもの
ディレクトリ構造
~/
├ PersonalShell/
├ main.sh # コマンドを記述したシェルスクリプト
└ pip3_all.py # pipを使ってライブラリを一括更新するPythonスクリプト
Pythonライブラリ一括更新
本当はワンライナーをシェルスクリプトにそのまま記述したかったのですが、パイプを使ったりしている関係か、うまくいかなかったので、別ファイルに記述してシェルから呼び出すようにしました。Pythonのsubprocess
を用いて、コード内でシェルのコマンドを動作させています。
import subprocess
cmd = subprocess.run("pip3 list -o | tail -n +3 | awk '{print $1}' | xargs pip3 install -U",
capture_output=True,
text=True,
shell=True # ここがコマンドインジェクション
)
print(cmd.stdout)
print(cmd.stderr)
このスクリプト、1点だけ注意するポイントがあります。
このファイルではコマンド(シェル)インジェクションを使用しています。再現した際に発生する可能性のあるセキュリティ上の問題の責任は負いません。自己責任でお願いします。
Homebrewの更新
これはHomebrewユーザーにとっては基本的なコマンドですね。brew upgrade
するだけで更新可能です。
シェルスクリプトにまとめる
これらをまとめて、回線判別の後に動作させてみた例です。
#!/bin/zsh
# 接続している回線名(SSID)を取得
wireless=$(networksetup -getairportnetwork en0)
echo ${wireless}
# if文で判別、SSIDは一例です
if [ "$wireless" = "Current Wi-Fi Network: Buffalo-A-****" ] || [ "$wireless" = "Current Wi-Fi Network: Buffalo-G-****" ]
# とあるルーターの5GHz/2.4GHzのどちらかであれば更新実行
then
brew upgrade
python3 ~/PersonalShell/pip3_all.py
else
# それ以外のSSID
echo "Not upgradeable"
fi
おまじない
最後に、権限 おまじない を付与して、シェルから呼び出せるようにします(Permission denied回避)。
$ sudo chmod 755 ~/PersonalShell/main.sh
エイリアスにしておくと、すぐ呼び出せて便利です。.zshrc
などの設定ファイルに追記しておきましょう。
alias "terminal-update=/Users/hogehoge/PersonalShell/main.sh"
おわり
もっとスマートな方法もありそうですが、現状動くのでいいかなと。