Ubuntuのパソコンをシャットダウンさせるスクリプトの作り方 | 社員,やってみた
こんにちは!リブーター"ヲタク"の元・開発アシスタントです。今回は「Ubuntuのパソコンをシャットダウンさせるスクリプト作成」に挑戦してみました。リブーターを活用することで、お客様の業務が少しでもスムーズになるようにと、私が勉強したことや試してみたことをこのコラムで共有していきます。Linuxを扱うプロフェッショナルな皆さんにも役立つ情報をお届けできれば嬉しいです!
初めに
リブーターの「スクリプト実行機能」を使えば、指定したOutletの電源をOFFする前に、TelnetやSSH接続で事前に設定したスクリプトを実行することができます。ただし、標準で備わっているスクリプトは「Windows」用で、Linux系OSには対応していません。しかし、この機能の真骨頂は「自作スクリプト」を実行できることです。今回は、私のUbuntuパソコンにSSH接続してシャットダウンコマンドを実行できるスクリプトを紹介します。コピー&ペーストOKですので、ぜひお試しください!(ただし、私の環境で動作したものなので、動作保証はできません。ご了承ください。)
Telnetと異なりSSHの場合は、スクリプト実行前に認証を行う
リブーターのSSH対応機種では、スクリプト実行時に接続方法として「Telnet」か「SSH」を選択できます。ただし、SSH接続では「ID/パスワード認証」をスクリプトで行う必要がありません。これがTelnetとの大きな違いです。
スクリプト実行フロー(Telnetの場合):
1. 電源OFF命令受付
2. 指定されたIPアドレスにTelnet接続開始
3. スクリプト実行(IDとパスワードの認証はスクリプトを利用して行う)
4. Ping確認(※有効時のみ)
5. OFF遅延(※有効時のみ)
6. 電源OFF命令実行
スクリプト実行フロー(SSHの場合):
1. 電源OFF命令受付
2. 指定されたIPアドレスにTelnet接続開始
3. 指定されたIDとパスワードで認証を実行
4. スクリプト実行(Telnetとは異なり、IDとパスワードの認証は含めない)
5. Ping確認(※有効時のみ)
6. OFF遅延(※有効時のみ)
7. 電源OFF命令実行
SSH接続時にUbuntuからの応答内容を把握しておくことが成功のカギ
SSHを使ってShutdownコマンドを実行する際、Ubuntu側からの応答内容を把握しておくことが重要です。私もスクリプトを作成する前に、WindowsパソコンからUbuntuにSSH接続し、どのような応答が返ってくるかを確認しました。
確認した内容:
1. WindowsのPowerShellで「ssh [ユーザー名]@[UbuntuのIPアドレス]」を実行
2. パスワードを入力する
3. プロンプト「$」が表示されたら、Shutdownコマンドを実行可能
4. sudoコマンドを実行すると再びパスワードを求められる
5. 「$」が再び表示されたら、コマンドの受付状態に戻る
6. 最後にexitコマンドでログアウト
UbuntuパソコンをSSHでシャットダウンするスクリプト
以下が私のパソコンにSSH接続してシャットダウンコマンドを実行できたスクリプトです。「パスワード」の個所を接続先のパスワードに変更し、テキストファイルとして保存してください。リブーターの設定画面の「スクリプト編集」から保存したファイルをアップロードすることができます。
SSH /初めにSSH接続であることを明示
timeout 600 /念のためにスクリプト実行のタイムアウトを設定
1:
recv 30 exit 91 /recvコマンドでサーバーからのデータを受信。30秒以内に受信できなければ、エラーコード91でスクリプト終了
unless "$" goto 1 /受信したデータに文字「$」が含まれていなかったら、「1:」に戻る
send "sudo shutdown -h +1¥n"
/オプションをnowにすると、$が返ってこなくなる
/スクリプト処理を正常終了させるため+1(1分後)とする
/→PING確認で最低1分間、電源OFF命令実行を遅らせる必要有り
2:
recv 30 exit 92 /recvコマンドでサーバーからのデータを受信。30秒以内に受信できなければ、エラーコード92でスクリプト終了
unless ":" goto 2 /受信したデータに文字「:」が含まれていなかったら、「2:」に戻る
send "パスワード¥n"
/前コマンドでsudoを使用している為、パスワードを聞かれる
/「パスワード」の部分は、シャットダウンさせたいSSHサーバーのsudo用のパスワードに変更
3:
recv 30 exit 93 /recvコマンドでサーバーからのデータを受信。30秒以内に受信できなければ、エラーコード93でスクリプト終了
unless "$" goto 3 /受信したデータに文字「$」が含まれていなかったら、「3:」に戻る
send "exit¥n" /SSH接続を終了させる
recv /SSH接続終了実行時のサーバーからの応答確認。
exit /exitコマンドでスクリプト終了
スクリプト実行中のサーバーとの通信内容を可視化
リブーターの「debOlShutdownDebug」変数を「1」に設定すると、スクリプト実行中のサーバーとの通信内容をシリアル出力して確認できます。スクリプトがうまく動作しない場合、これを活用して原因を調査してみてください。
MOTD (Message Of The Day) が表示されないようにご注意ください
「MOTD (Message Of The Day)」は、ユーザーがログインした際にメッセージを表示する仕組みです。Ubuntu Serverをご利用の方であれば、SSHでログインした場合にもMOTDがデフォルトで表示されるように設定されているかもしれません。
このMOTDが表示されるとパケットサイズが大きくなり、スクリプト実行中にリブーターが受信できるパケットサイズの上限(1500バイト)を超えてしまうことがあります。そのため、スクリプトが失敗するケースが生じることがあります。(私もこの問題に悩まされました…)
私の場合は、シャットダウンさせるスクリプト用のユーザーを作り、そのユーザーのホームディレクトリに.hushloginというファイルを作成し、ファイル内に以下の一文を追記すれば、リブーターのスクリプト実行時はウェルカムメッセージが表示されなくなりました。
touch ~/.hushlogin
これにより、そのユーザーがログインしたときにMOTDが表示されなくなります。
最後に
今回のコラムが少しでもお役に立てれば嬉しいです。お客様からのフィードバックや質問も大歓迎ですので、ぜひお気軽にお問い合わせください。リブーターの機能を最大限に活用して、効率的な運用をサポートできることを願っています。次回もどうぞお楽しみに!