for loop

Local Linuxのshutdown

目標

Localで使ってるLinuxをremoteと間違えずに停止する

動機

local machineをLinuxで使ってて、停止処理もterminal上なので、sshでアクセスするremote nodeと停止処理が一緒になってしまう
実際に何度か間違えてremote nodeを停止して辛い思いをしたのでfool proofな停止方法を考えたい

結果

sshのセッションではshutdownしないコマンドを作る

過程

停止のコマンドは色々あるようだけれど、停止のプロセスや再起動の有無などがメインでremoteの場合とlocalの場合を分けるような使い方についての情報は見付けられなかった

Linuxのシャットダウンや再起動のコマンドは色々ある – kanonjiの日記

普通の人はこういうところで困ることがなさそうなのだけど、あまりリモートの停止処理が問題にならない理由は下記あたりかな。。

  1. local nodeをterminalから停止しない
  2. localとremoteでパスワードが違う

1.についてWindowsやLinux Desktopの場合でもWindow ManagerのGUIで停止する場合などはそもそもremoteと同じ処理で停止しないのでlocalと間違えて、というのはなさそう(複数のremote同士というのはあるかもしれないけど)

私はタイル型WMのXmonadを使っていて停止用のGUIインターフェイスはないのでterminalからコマンドでlocalを停止してるけど、これが少数派なのかもしれない。みんなもっとXMonad使おう

ちなみにXmonadの場合下記のように自分で設定ファイルを書き変えてキーバインドに割り当ててる、というのが散見された。
Xmonad doesn’t have permissions to reboot when started via init[SOLVED (Page 1) / Applications & Desktop Environments / Arch Linux Forums

停止方法について質問してるような例もあったけれど、GDM入れるというのが提案されていて、多分一度XMonad抜けるというのが前提
[xmonad] Logout, Shutdown, Restart.

2.についてセキュリティの観点で当然の心得だとは思うけれど、無精な私はテスト用のVMなどはsudoがパスワードの再入力なしで実行できるようにしてしまっていて今のところ改めるつもりがない

ということであまり既成のツールとかは期待できなさそうなのでちょっと書いてみることに
インターフェイスを変えるのが有効そうなのでlocalでコマンドを変更する、というのが良さそうかなと。ついでに普段サーバーとしてアクセスしてるノードにも直接キーボード繋いでアクセスすることもあるのでsshで接続してる時にはshutdownしないというスクリプトにして、各ノードに配布することで目の前のnodeを停止する場合のみに使える、というコマンドにしてみた。需要なさそう。。。

ちなみに、注意点としては親にsshがあるかを探していてtelnetやmoshでの接続の場合は普通にshutdownされてしまうこと。 あと初めの一文字をshutdownのオプションにしているので名前を変えるときにはhからはじまるようにしないと停止しなかったりする。rにするとリブートする

私はhalt local/reboot localという意味からhlocal/rlocalという名前でコマンドにしていてrlocalはhlocalへのシンボリックリンクにしたかったのでこういう作りになってる

とりあえず私はこれで誤停止しなくなったのだけど、また別のシチュエーションでの停止の問題があったら他の方法も考えてみたい