Mac とNAS とUPS と

質問兼、情報提供です。情報はネタ程度でお読み下さい。

まず使用機器は下記です。

Mac macOS High Sierra 10.13.3

NAS Synology DS215j

UPS OMRON BN50T PowerAttendant Lite 1.11(最新版は1.12 のようです。)

UPS Mac USB 接続


それでここで質問です。

シェルスクリプトでssh shutdown コマンドを無人で実行する場合、管理者パスワードが平分になるようです。これを暗号化する方法はないでしょうか。

可能であればMac に純正でないアプリケーション等をインストールせずに行いたいと考えます。また認証鍵で行う方法が有るようですが、これも避けパスワード方式だとありがたいです。

手っ取り早く思いついたのはAutomator でアプリケーションにしてしまえばテキストファイルではなくなります。が、Hex Editor 系のアプリケーションで覗くとパスワードとは判らないかもしれないですが、やはりテキストとして内部に存在します。

なおシェルスクリプトの実行はUPS メーカの提供するユーティリティで停電時にコマンドラインを実効する能力があるようですので、それを使おうと思っております。未検証ですがシェルスクリプトをアプリケーション化した場合はopen コマンドでアプリケーションを実行出来るのではと推測しています。(アプリケーションを直接実行する機能もある気配です。)


以下、情報(ネタ)です。不要な人は読み飛ばして下さい。

Apple 製の機器でない話なのでサラッと書きます。PowerAttendant Lite というユーティリティですが先にも書いた通りUPS との連携で停電時などに接続された機器をシステム終了する機能があります。その機能の中にLAN 接続の機器にssh でログインしshutdown コマンドを実行する能力があります。

今回、この設定に数日かかりました。探し方が悪い可能性がありますがネットを検索してもイマイチでした。成功した設定が下記です。一部割愛して書きます。


コマンドタイプ: SSH V2

OS:Linux

文字コード:macintosh


下記4 項目はNAS に設定した物を設定しました。ただし一般も管理者も管理者のID とパスワードを設定しました。別に一般である必要もないようなので。

ログイン一般ユーザID

ログイン一般パスワード

ログイン管理者ユーザID

ログイン管理者パスワード


スクリプトファイルの内容はサンプルを参考に下記。

rcv=$

snd=su $u2

rcv=word:

snd=$p2

rcv=$

snd=sudo shutdown -h now

rcv=word:

snd=$p2

rcv=$

snd=exit

上から4 行はいらない気がしまが、とりあえず動くので、このままにしています。shutdown コマンドを工夫すれば停電復帰後に自動で起動することもできるとネットに出ていましたが、自動起動はしなくてよいので単純に落しています。

数日悩んだのが「文字コード」です。NAS の文字コードだと思い込みデフォルトのUTF-8 にしていたため動きませんでした。


長くなったので、とりあえずここで一旦、設定編と言う事で書込みます。

Apple Pencil, OS X Yosemite (10.10.5), null

投稿日 2018/02/27 04:22

返信
スレッドに付いたマーク ランキングトップの返信

投稿日 2018/04/15 04:02

AppleScriptに移行してしまったようで、もしかしたら見当違いかもしれませんが...


securityコマンドで、キーチェンにアプリケーションパスワードとして追加・表示・削除することができます。

security add-generic-password -a account_name -s service_name -w secret_password security find-generic-password -a account_name -s service_name -w security delete-generic-password -a account_name -s service_name

事前に"security add-generic-password"でマシンに登録しておき、次のスクリプトを叩けばパスワードを書かなくて済みます。

#!/bin/bash -eu PASSWORD=$( security find-generic-password -a account_name -s service_name -w ) expect <<EOD set timeout 1 spawn sudo shutdown -r now expect "Password:" send "$PASSWORD\n" expect eof EOD exit 0

しかし、account_nameかservice_nameかが分かってしまえば(securityコマンドを使える人なら)誰でもsecret_passwordを見れてしまうので、管理者パスワードを登録するのは無謀ですよね...。


ところで、「無停電電源装置(UPS)でシステム終了するまでの時間を設定する」ではダメなのですか?

https://support.apple.com/kb/PH25520?viewlocale=ja_JP&locale=ja_JP

返信: 43

2018/03/09 06:02 ni_ki への返信

手が滑って入力してしまいました。

どうやら直接先のssh コマンドを実行するアプリケーションを指定すると動きません。なので、ssh を行うアプリケーションを起動するアプリケーションを作成してそちらをOMRON のユーティリティから呼び出します。

また何故か状況によってssh のキーだったかの作成を問い合わせてくることがわかりました。その際にはyes を入力する必要があります。それに対応するために作成したのが下記です。

--NAS のIP アドレス

set NASIP to "10.0.1.2"



-- NAS のユーザ名

set NASUser to "niki"



-- NAS で実行したいコマンド

set lsComma to "sudo ls -l"



-- NAS のユーザのパスワード

set NASPass to "apple"



-- ssh コマンドの合成

set sshComma to "ssh -l " & NASUser & " " & NASIP



tell application "Terminal"

delay 1
do script sshComma in front window
activate
delay 1
tell application "System Events"
keystroke "yes"
keystroke return
end tell
activate
delay 10
tell application "System Events"
key code 102
keystroke NASPass
keystroke return
end tell
activate
delay 10
do script lsComma in front window
activate
delay 10
tell application "System Events"
key code 102
keystroke NASPass
keystroke return
delay 2
key code 102
keystroke "exit"
keystroke return
end tell
delay 5
activate
delay 1
-- quit

end tell

2018/03/10 05:27 hohokihai への返信

hohokihai さんへ

申し訳ありません。expect コマンドを諸々勘違いしておりました。

それ以外にもOMRON のユーティリティでできないと思っていた、シェルスクリプトの呼び出しが昨日の探索でできるらしいことがわかったので、expect コマンドの探索をして見たいと思います。

ちらりと試したらspawn で躓いてしまいました。私のことですから恐らく、凄まじく幼稚なところで躓いていると思いますので、水深で例えるなら潮干狩りくらいの深さにたどり着けたら、そこら辺について書かせていただきたいと思います。

2018/03/10 05:37 ni_ki への返信

諸般の都合で連書き失礼いたします。

以前にUPS とMac の間の通信が不定期に切れる件を記載いたしました。その対処は今までMac をスケジュール機能で再起動することでした。発生確率が連続起動で一週間に一回くらいと思っていたので、今まではそれで良かったのですが状況によっては、24 時間以内でも発生することがわかりました。

それで一晩たち「もしかしてUPS 側に対処法があるかも」と思い至り、探して見たところ対処機能がありました。

どうやらUPS とMac 間の「通信エラー」の時に動作するようにスクリプトが設定できるようです。

その機能を使ってUPS と通信エラーが起きたらMac をReboot するスクリプトを実行するようにしました。

ただし、設定後にまだ「通信エラー」が起きていないので実戦で動くかは不明です。ここ数日の経験からは動くはずですが。

2018/03/22 20:58 ni_ki への返信

hohokihai さんからお教えいただいたキーチェーンの件は今後組み込んでみたいと思います。とりあえず動かせる状態にこぎつけさせて頂きました。

ちなみに説明するほどでもないですが「-d」は当然、不要です。処理がダラダラ表示されて面白いので付いています。変数ももっと少ない方が見やすいです。「ssh niki@10.0.1.2」をappend で作成する必要もまるでありません。「ssh niki@10.0.1.2」とストレートに書き込んだ方が見やすいと思います。勉強という事で複雑になっています。

また前の書き込みの際には「\n」を使用しておりましたがman だと「\r」との記載があったのでそちらにいたしました。「busy」の行はman にサンプルがありましたので入れただけでまったく意味がないです。この行は文字が一致する事はないと思います。「-re Password:|password:」も今回のNAS は「password」が返ってくるとわかっているので、そちらだけで良いのですが「-re」を使って見たかったということです。

timeout の数値はNAS によっては短いかもしれません。スリープ解除にどのくらいかかるかによります。まごつくとタイムアウトしてしまいます。

またOMRON からはApple Script で作成したシェルスクリプトを呼ぶアプリケーションを呼び出し、そのアプリケーションからexpect を読んでいます。この方が安定動作する気配なのでこのようにしております。Apple Script はNAS を落とそうとしているMac そのものもUPS の電源断を前に終了する必要があるので「> /dev/null 2>&1 &」でバックグラウンドにしております。NAS が二台以上に際に待たないようにする意図です。

2018/03/23 21:46 ni_ki への返信

「Password:|password:」の部分ですが、[Pp]assword の方が分かりやすいかと思ったらスクリプト中では「\[Pp\]assword」としないとダメなようです。言語の仕様上、変数だったかに[] が使われるためらしいですが、シンプルさにかける表記になってしまいます。

#!/use/bin/expect にしないと” を片っ端から\ しないといけないようですし場合によっては\\\ と三重の必要もあるそうです。

2018/03/26 20:49 ni_ki への返信

expectには-nocaseオプションが設定できるようです。


「-nocaseフラグは、小文字が含まれている場合に大文字に変換してからマッチさせる。」

https://linuxjm.osdn.jp/html/expect/man1/expect.1.html


というわけで、expect -nocase "PASSWORD:"でいけそうです。macOSでは全て小文字"password:"で設定しても動いてしまいましたが...

2018/03/26 23:26 hohokihai への返信

hohokihai さんによる書き込み:


先に挙げた例に於いて、expectのところで{}を付けないとタイムアウト時にもsendされてしまうみたいですね。

そうです。man には記載があるのですがネット上では「expect がタイムアウトする」と書かれているので当初はタイムアウトでexit になるのかと勘違いしておりました。なので逆にタイムアウトしなければssh する場合は文字列が合致しなくても順序さえ合っていればログインに成功するはずです。

「password:」の部分を冗談で「Excel」にしてもログインに成功したことがあります。

2018/04/18 07:12 hohokihai への返信

hohokihai さんによる書き込み:


私もタイムアウトの挙動を分かっていなかったので、混乱させてしまって申し訳ありませんでした。

私も書き方が悪かったようです。expect 文で文字列が一致しない場合はtimeout で設定した時間経過後、次のsend 文が実行されるという意味のタイムアウトです。はじめ私はexpect 文は文字列が一致しないと次に処理を渡さないと思っていました。渡さないでタイムアウトでスクリプトが停止すると思ったら次の行に処理が渡されるのでビックリしました。

expect {send ......} にしていないと起きるようです。

2018/03/24 01:02 ni_ki への返信

前のコメント、HTMLエンティティ化していなかったので今は最後まで見れませんが、クォーテーションのエスケープを避けるため、ヒアドキュメントを使うことができます。expectコマンドは色んな書き方ができるようで、私は全て把握していませんが、参考までに。

ユーザがアップロードしたファイル

このスレッドはシステム、またはAppleコミュニティチームによってロックされました。 問題解決の参考になる情報であれば、どの投稿にでも投票いただけます。またコミュニティで他の回答を検索することもできます。

Mac とNAS とUPS と

Apple サポートコミュニティへようこそ
Apple ユーザ同士でお使いの製品について助け合うフォーラムです。Apple Account を使ってご参加ください。