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/04/15 04:02 ni_ki への返信

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

2018/03/18 01:35 ni_ki への返信

man を確認したら勉強不足がわかりました。expect は文字列の一致がない場合、timeout で次に処理を渡すコマンドでした。

嫌ならタイムアウトさせないか、timeout 処理をするかのようです。

ようやく合点がいきました。

set timeout 3

spawn ssh niki@10.0.1.2

expect \”xx\”

send \”apple\n\”

expect \”yy\”

send \”sudo shutdown -h now\n\”

send \”orange\n\”

条件分岐がなければ上記で大概、電源オフできそうです。xx,yy は英数ならなんでもOK です。apple, orange は正確なパスワードでないとダメですが。

timeout の数値はNAS が寝ぼけていると大きくした方が良いかもですが。大きすぎるとUPS が先に切れるかも。


一応完成と思ったのですが改良が必要なようです。

なお改良前ですが2度の停電試験(と言ってもUPS のコンセントを抜くだけ。)で2回とも正常に電源オフできました。OMRON 純正の電源オフとexpect コマンドによる電源オフが悪影響あるかと思いましたが大丈夫な良うです。

2018/03/16 18:27 ni_ki への返信

とりあえず動きましたがexpect コマンドはエスケープと正規表現がサッパリです。

spawn ssh niki@10.0.1.2

expect -re \”niki*\”

でまったくexpect -re が正常に反応しないのでその次に行のsend が動きません。ところがMac 相手なら、

spawn ssh niki@10.0.1.3

expect -re \”*word*\”

でログインできたりします。\ を\\ にしたりしましたがダメでした。

さらに

expect \”パスワードを求めてくる全文\”

にしてみましたが「’」が入っておりダメでした。\’ にして見ましたがやはり動かず。非常に面倒です。

結局、

!#/bin/bash

から

!#/use/bin/expect

でエスケープ不要にして、とりあえず動かせました。

expect \”*word*\”

-re なしで動くので不思議です。!#/use/bin/expect のさいは-re 不要なのですね。

ちなみにこのスクリプトを呼び出すAppleScript で作成したアプリケーションを作成し、そのアプリケーションをOMRON から呼び出します。

2018/03/07 03:39 ni_ki への返信

AppleScript エディタからコピーペーストした、テキストエディットからの「標準テキスト」でのコピー& ペーストが、ここでおかしな表示をするので別で書き込ませていただきます。

素人が書いたスクリプトですから、何が起きるかは不明です。私のところでは、AppleScript としては動きました。

また上記は実験用のls -l コマンドを実行するスクリプトです。ssh でログイン後、sudo コマンド付きでls -l を実行します。NAS 上で管理者パスワードの入力ができるよう試すためにls コマンドに不要なsudo をつけております。

本番ではsudo shutdown -h を実行します。

たぶん他の人が使う場合は、上の方に書き込まれている変数4 個を自分の環境に合わせれば動くと思います。

ちなみにkey code 102(英数キーを押すのと同じらしい。) とdelay がそこら中に入っているのは念のためです。最後の方のexit とquit はしなくても良い気がしますが、OMRON のスクリプトサンプルが何故かexit しているのでつけてみました。quit は気まぐれにつけてみました。

2018/03/17 18:33 ni_ki への返信

#!/bin/bash

expect -c “

set timeout 2

spawn sudo ls

expect \”sisyamo\”

send \”apple\n\”

interact

上記がMac でも正常に「sudo ls」コマンドが実行されることを確認いたしました。NAS が原因ではないようです。

macOS High Sierra 10.13.3

interact を付けるとそうなるのでしょうか。

2018/03/22 06:35 ni_ki への返信

expect を使った、いわゆるシェルスクリプトです。


#!/usr/bin/expect -d



set NASUser niki

set NASIP 10.0.1.2

set NASloguinpass apple\r

set NASpass $NASloguinpass

set toNASCommand ssh

set shutcommand "sudo ls\r"

append Hostnama $NASUser @ $NASIP

#set Hostnama $NASUser@$NASIP



set timeout 18

spawn $toNASCommand $Hostnama



expect {

(yes/no) {send "yes\r" ; exp_continue}

-re Password:|password: {send $NASloguinpass}

busy {puts “busy\r” ; exp_continue}

timeout {exit}

}



expect {

NAS {send $shutcommand ; exp_continue}

-re Password:|password {send $NASpass}

timeout {exit}

}



expect {

NAS {exit}

timeout {exit}

}



interact

2018/02/27 07:27 ni_ki への返信

> 管理者パスワードが平分になる


スクリプトの中で平文になってるだけで、sshですから、もちろん通信の最中は暗号化されてます。

パスワードを平文で書くのが嫌なら、認証鍵を使うしかないです。

でも、いろいろ試してますが、うちでもhigh sierraのssh の鍵認証がうまくいってませんけど。あちこちのウェブに書いてあることを試してるのだけど、ダメですね、、、これがうまくいくなら、パスワードなしでログインできるので、大変便利です。

2018/02/28 18:58 ni_ki への返信

ni_ki による書き込み:


このNAS はブラウザから設定ができるのですが、どうやらログインしていない又は既にサインアウト済みでも、ある程度の時間、LAN からのシャットダウンを拒否するようです。

説明が曖昧でした。シャットダウンを拒否と書きましたがこれはOMRON のユーティリティからのshutdown コマンドを拒否するという意味です。ssh でログインは成功しますがシャットダウンはできません。

ターミナルから試すとできるので何故、OMRON 製からできないかは原因不明です。

2018/03/03 04:19 hohokihai への返信

ありがとうございます。

キーチェーンにそのようなコマンドがあったのですね。存じ上げませんでした。記憶させていただきます。


大変申し訳ありません。大事なことを書き込んでいたなかったことに気付きました。expect コマンドがNAS にないようでssh でログイン後、not found が返ってきました。

何か他に応用できないか考えたいと思います。

hohokihai さんによる書き込み:


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


Mac の方はshutdown コマンドでもOMRON 製ユーティリティーでも、かなりの確率で落とせるので問題少ないのですがNAS の方が高確率でコケております。なのでMac から発するshutdown コマンドとOMRON 製UPS から発するshutdown コマンドで成功率を上げたいと考えております。ちなみに今の所8 回試して3 回コケました。内容は下記です。

以下、初回からの実験結果です。

コケ、成功、コケ、コケ、成功、成功、成功、成功

全部で8 回です。一回目は設定ミスでした。3,4 回目は直接の原因が不明です。ただ、どちらも実験直前(数分くらい。)にNAS の設定画面にSafari でログインしていました。

8 回目の実験はSafari から設定画面にログインしていましたが、正常にシャットダウンされました。

これで何が何やら不明になりした。

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

連書き失礼します。ここのエディタの都合で、小分けにしないと書きにくいためです。

それで、先のスクリプトですがssh コマンドはパスワードを間違っても3 回聞いてくることを利用しております。yes の入力が不要でも二度目のパスワード問い合わせでssh に成功します。ただしパスワードが違う場合に再度パスワードを確認してくるまで数秒かかるようなのでdelay 10 を入れて時間をかせいでいます。



それと本日、13 時前にUPS とMac の通信が切れておりました。切れると自動で復帰しないので毎日夜中にMac を再起動して通信切れに対応していましたが、それでも切れることがあるようです。これは運に任せるしかなさそうです。更にOMRON ユーティリティの設定と作成して保存しておいたスクリプトも消えておりました。原因は不明です。Mac の再起動に10 分近くかかった症状も確認されたのでOMRON とは無関係な可能性もあります。

2018/03/11 22:18 ni_ki への返信

ni_ki による書き込み:


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

昨日の午後2 時過ぎに通信エラーが起きてMac が再起動していたことがUPS のログからわかりました。その前が数日前ですから、頻繁に通信エラーが起きているようです。故障でなければ良いのですが。

とりあえず通信エラースクリプトが機能することはわかりました。そに点はめでたいです。

expect コマンドの方は勉強中で進展ありません。

2018/03/17 03:43 ni_ki への返信

スクリプトの公開に向けて検証を進めた結果、謎が深まりました。ただしとりあえずUPS をコンセントから抜くと作成したスプリプトでNAS はシャットダウンできました。

生まれた謎が下記です。!#/bin/bash でNAS にssh でログイン後で

expect \”NAS\”

send \”sudo ls -l\n\”

expect \”Password\”

send \”apple\n\”

expect \”NAS\”

send \”exit\n\”

プロンプトに含まれる「NAS」という文字と部分一致させてsudo 付きでls コマンドを入力しパスワードを聞いて来たらパスワード「apple」を入力。コマンドが実行されてプロンプトが戻ったかを「NAS」という文字の部分一致で確認し「exit」するスクリプトです。一見正常に動きますが、実は異常がありました。

下記でも動くのです。

expect \”NAS\”

send \”sudo ls -l\n\”

expect \”Password\”

send \”apple\n\”

expect \”kyabetu\”

send \”exit\n\”

下から二行目expect コマンドにワザと部分一致しない文字列を指定します。私の浅い認識では文字列が一致しないので最後の「exit」は実行されないと思っておりましたが、試すとタイムアウト時に最後のexit が実行されて終了します。別の原因でログアウト処理しているかもと思いsend \”w\n\” に変えたらw が実行されました。

expect は一致しないと処理を止めると思っていたのですが最後に方は何か決まりがあるのでしょうか。

expect \”Password\” は一致しないと延々と止まるのですが。

ちなみにダミーをかませて条件分岐で一応回避はできるようです。何か大勘違いしている気はしますが。

expect \”dummy\” {

send \”nanika\”

} \”kyabetu\” {

send \”exit\n\”

}

上記だと「kyabetu」が一致しないとexit しません。

2018/03/17 15:17 ni_ki への返信

一晩、検証して見ました。結果、

expect

send

......

expect

send

で書いた場合は、すべてのsend が前行のexpect の結果に関わらず実行されます。

また条件分岐で、

expect \”dummy\” {

send \”dummy\”

} \”NAS\” {

send \”ls\”

expect \”nissinn\”

send \”sannma\”

}

とすると「NAS」が一致すると、ls が実行されるのは当然ですが、「nissinn」は合致しなくても「sannma」が実行されます。「NAS」が一致しなければ「sannma」は実行されず、次があるなら次に移行します。

ではexpect \”nissinn\” は何もしていないかというと、そうでもなく「nissinn」が合致すれば即座に次行のsend が実行されます。合致しないと数秒もたつきます。

ちなみにこの症状はMac からSynology のNAS にssh でログインしての事です。ログイン前はexpect が一致を確認している気配です。ssh ログインを担うスクリプト部のexpect \”password:\” をわざとexpect \”EGword\” とかに変えると動かなかったので。

何が起きているのか理解し難いです。

2018/04/17 23:58 ni_ki への返信

> 今、気付きましたがお書きの状態はタイムアウトによるものですね。


いえ違います。しかしながら大文字で書けば良いだけなので気にする必要はないのでしょう。また、"set timeout 1"だと少ないかもしれません(このサンプルでは"total 0"のみの出力で終わることがありました)

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

タイムアウトの場合にはこんな感じになります。

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

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

2018/05/02 20:02 ni_ki への返信

Mac とNAS の間の通信エラーですが「最新OS に対応いまいちなのか」などと考えておりましたが、普通に故障でした。NAS 側のUSB 端子部が悪い気配です。

通信エラーが起きるとMac を再起動するスクリプトを入れていたのでTime Machine のバックアップ中にも頻繁に再起動が起き、バックアップが完了できない状態になったので、NAS 管理専用のMac(OS のバージョンを戻して)を投入しました。それでも改善せずで故障と気付きました。

ここまで気付かないとは**でした。

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

Mac とNAS とUPS と

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