Macでのリモートアクション用スクリプトの作成
このページでは、Mac上でNexthinkのリモートアクションスクリプトを準備するプロセスの詳細を説明します。 スクリプトは、Unix系の多くのオペレーティングシステムでサポートされているコマンドラインシェルおよびスクリプティング言語であるBashで書かれた後、セキュリティーのために証明書で署名されます。 Bashスクリプトは、タスクの自動化や構成管理に適しており、リモートアクションを従業員のデバイスで実行することができます。
リモートアクションの主なユースケースは、デバイスからのオンデマンドデータ収集、セルフヒーリングタスク、および構成設定の変更です。
この記事は、読者がBashスクリプティングに精通していることを前提としています。
詳細については、Remote Actionsグループのコミュニティのドキュメントを参照してください。
スクリプトの作成
一般的なスクリプトと入力変数
デジタル署名されたスクリプトのカスタマイズが必要な場合に、汎用スクリプトは便利です。 署名済みスクリプトを変更するとその署名は無効になりますが、汎用スクリプトはパラメーターでカスタマイズでき、署名を保持します。
スクリプトの冒頭でパラメータを宣言し、Bashの位置パラメータとして次のように2つの特別なコメントの間に挿入します:
# NXT_PARAMETERS_BEGIN
Parameter1=$1
Parameter2=$2
Parameter3=$3
# NXT_PARAMETERS_END
リモートアクションの構成中にスクリプトをアップロードするとき、システムはBashスクリプト内の特別なNexthinkコメントの間にあるパラメーターを取得します。 それらをスクリプトテキストの下にあるパラメーターセクションに一覧表示します。 各パラメータ名の右側に表示されたテキスト入力ボックスに、実際の値を提供してください。
アウトプット変数の作成
スクリプトを実行すると、オンデマンドデータとして保存したいアウトプットが生成されることがあります。 Nexthinkは、Collectorと同時に従業員デバイスにインストールされるBashスクリプト(nxt_ra_script_output.sh
)を提供しています。 このスクリプトには、結果をデータレイヤーに書き込むための関数が含まれています。
リモートアクションのアウトプットにNexthinkスクリプトの関数を使用するには、Bashスクリプトの最初に以下のヘッダーを追加してください。
#!/bin/bash
. "${NEXTHINK}"/bash/nxt_ra_script_output.sh
すべての書き込み方法は、アウトプット名と書き込む値の2つの引数を受け入れます。 例えば、ディレクトリ内のファイル数をデータレイヤーに返したい場合、スクリプト内の変数nfiles
にその数が含まれます。 nfiles
の値をFileNumber
というアウトプット名でデータレイヤーに書き込むには、符号なし整数の書き込み関数を呼び出してください。
nxt_write_output_uint32 'FileNumber' $nfiles
リモートアクションエディタは、スクリプト内のアウトプットの書き込み呼び出しを認識し、アウトプット変数をアウトプットセクションに一覧表示します。 アウトプットのラベルを設定して、調査やメトリクスでどのように参照するかを示してください。
各write
メソッドの終了はアウトプットの種類を示します。 Bashは、緩やかに型付けされた言語であるため、アウトプットの種類は文脈によって解釈されます。 利用可能なメソッドの一覧は次のとおりです。
nxt_write_output_string
0 - 1024文字(アウトプットが大きい場合は切り詰められます)
nxt_write_output_bool
true / false
nxt_write_output_uint32
最小値: 0
最大値: 4 294 967 295
nxt_write_output_float
最小値: -3.4E+38
最大値: 3.4E+38
nxt_write_output_size
最小値: 0
最大値: 3.4E+38
nxt_write_output_ratio
nxt_write_output_bitrate
nxt_write_output_duration
最小値: 0ミリ秒
最大値: 49日
ミリ秒単位の精度
nxt_write_output_date_time
YYYY年MM月DD日 HH時MM分SS秒
nxt_write_output_string_list
0 - 1024文字(アウトプットが大きい場合は切り詰められます)
キャンペーンの実装
従業員が独自に問題を解決できるよう、リモートアクションとキャンペーンを組み合わせましょう。 キャンペーンを使用して、従業員に問題の検出を通知し、その解決に向けて誘導します。
デバイスとやり取りしている従業員のデスクトップにキャンペーンを表示するには:
キャンペーンはリモートアクショントリガーを持ち、公開されなければなりません。
リモートアクションのスクリプトは以下のいずれかで実行できます。
特別な権限を必要としないアクションの場合、従業員のコンテクストで。
管理者特権を必要とするアクションの場合、ローカルシステムアカウントのコンテクストで。
キャンペーン識別子の取得
リモートアクションからキャンペーンを実行するメソッドでは、引数としてキャンペーン識別子を渡す必要があります。 キャンペーンNQL ID(推奨)とキャンペーンUID(クラシックオプション)の両方を使用できます。
NQL IDを識別子としてサポートするには、Collectorバージョン23.5以上が必要です。
リモートアクションにキャンペーン識別子を渡すには、必要なキャンペーンごとにリモートアクションのスクリプトでパラメータを宣言します。 リモートアクションを編集するときに、実際の値としてNQL ID(またはUID)を使用します。
詳細な情報やNQL IDおよびcampaignのUIDを取得する方法については、campaignをトリガーするのドキュメントを参照してください。
リモートアクションのスクリプトからキャンペーンを実行する
次の関数はリモートアクションのスクリプト機能を拡張します。
nxt_run_campaign( id )
この関数は、引数として渡されたNQL ID(推奨)またはUIDに一致するキャンペーンを実行し、解答を内部に保存します。
キャンペーンのステータスを受信した場合、関数は0を返します。
その他のケースでは関数は1を返し、エラーはログに記録されます。
この関数を呼び出すと、従業員がキャンペーンを完了するか、却下するまでリモートアクションの実行が一時停止されます。
nxt_run_campaign_with_timeout( id timeout)
この関数は、引数として渡されたNQL ID(推奨)またはUIDとタイムアウト(秒単位: 0 < T < 1 週間)に一致するキャンペーンを実行し、解答を内部に保存します。
キャンペーンのステータスを受信した場合、関数は0を返します。
その他のケースでは関数は1を返し、エラーはログに記録されます。
この関数を呼び出すと、従業員がキャンペーンを完了するか却下するか、タイムアウト前にキャンペーンを完了できなかった場合までリモートアクションの実行が一時停止されます。
nxt_run_standalone_campaign( id )
この関数は、引数として渡されたNQL ID(推奨)またはUIDに一致するキャンペーンを実行し、解答を内部に保存します。
キャンペーンのステータスを受信した場合、関数は0を返します。
その他のケースでは関数は1を返し、エラーはログに記録されます。
この関数を実行すると、キャンペーンの開始がトリガーされ、従業員の回答を待たずにリモートアクションの実行が続行されます。
nxt_get_campaign_status( res_var )
関数:
res_var
にキャンペーンのステータスが無事に保存された場合は0を返します。その場合は1を返します。
その後、キャンペーンのステータスを文字列として抽出し、指定された変数 res_var
に保存します。 関数が0を返した場合、res_var
には以下のいずれかの値が含まれています:
完全: 従業員がキャンペーンの質問に完全に回答しました。
タイムアウト: ユーザーが回答を終える前にキャンペーンがタイムアウトしました。
延期: 従業員がキャンペーンへの参加に同意しました。
拒否: 従業員がキャンペーンへの参加を拒否しました。
接続失敗: スクリプトがキャンペーン通知を制御するCollectorコンポーネントに接続できませんでした。
通知失敗: スクリプトがキャンペーンを正常に表示できなかった理由は次のいずれかです。
存在しないキャンペーン、または未公開のキャンペーンのため、プラットフォームからキャンペーン定義を取得できませんでした。
別のキャンペーンが既に従業員に表示されています。
Collectorの集中保護または「邪魔しないで」ルールのために急を要しないキャンペーンを表示できません。 詳細については、キャンペーンの受信率を制限する方法のドキュメントを参照してください。
最後のキャンペーンが失敗した場合は空白になります。
nxt_get_response_answer( res_var question_key)
質問ラベルを文字列パラメータのクエリ_keyとして使用して、最後のキャンペーンに問い合わせます。 関数は回答を文字列として抽出し、指定された変数 res_var
に保存します。
res_var
にキャンペーンの回答が正常に保存された場合は0を返します。それ以外の場合は1を返します。
スクリプトのエンコード
リモートアクション用Bashスクリプトを書くには:
スクリプトを含むファイルをBOMなしのUTF-8でエンコードします。
コードの各行は、UNIXシステムの通常の文字
LF
で終了します。
エンコードを正しく行い、エラーや機能しないスクリプトを避けてください。
コード例
スクリプトの署名
署名証明書の作成
MacOS Sequoia (バージョン15)から、Appleによる変更により、署名証明書自体をすべてのデバイスで信頼されたものとして展開する代わりに、署名証明書のルート認証局 (CA) を展開する必要があります。 オペレーティングシステムに事前インストールされた公開ルートCAは機能しません。
リモートアクションを実行する全てのデバイスに対して、以下のオプションのいずれかを展開することができます;
リモートアクション専用の自己署名ルートCA
社内のルートCA
以下は、自己署名ルートCAを作成し、それを使用してリモートアクションの署名用コード署名証明書を生成する方法の例です:
Macデバイスでキー チェーンアクセスを起動します。
Keychain Access > 証明書アシスタント > 証明書局を作成... に移動します。

証明書局の名前をEnterします。
ユーザー証明書でコード署名を選択します。
管理目的の連絡先として使用するメールアドレスをEnterします。
Create をクリックして証明書を生成します。

以下は、コード署名証明書自体を作成する方法の例です。
MacデバイスでKeychain Accessを起動します。
キー チェーンアクセス > 証明書アシスタント > 証明書を作成… に移動します。

証明書名を入力してください。

この証明書の発行者としてルートCAを選択します。

下記のように証明書を生成し、確認を得るために作成をクリックします;

証明書が作成されると、Keychain Accessアプリケーションに表示されます。 証明書を右クリックし、情報を取得をクリックします。

下までスクロールしてSHA-1をコピーアンドペーストします。 リモートアクションスクリプトを署名するために、値からスペースを削除します。

署名スクリプトにコード署名証明書を使用します:

以下のようにコマンドを実行して、以前のスクリプト署名手順が成功したかどうかを確認します。

パッケージング
.tarアーカイブと.gzip圧縮を用いてリモートアクションスクリプトをパッケージ化してください。 ".tar.gz"拡張子は必須です。
tar -czvf ./<スクリプト名>.tar.gz ./<スクリプト名>.sh
スクリプトファイルが署名されている場合、tarユーティリティはその拡張属性もパックします。 この方法で、システムはコード署名とスクリプトファイルを転送できます。
制限事項
一つのアーカイブには一つのスクリプトしか入れられません。
スクリプトファイルはルートパッケージフォルダに配置する必要があります。
./myscript/myscript.sh
パスは正しくありません。スクリプトは.sh拡張子を持っていなければなりません。
スクリプトファイル名はUTF-8エンコードである必要があります。これはmacOSでデフォルト設定です。
例
test.sh
スクリプトのパッケージ化の例:
tar -czvf ./example_ra_script.tar.gz ./example_ra_script.sh
生成された example_ra_script.tar.gz
はリモートアクションスクリプトファイルです。
#!/bin/bash
#
# script_signing.sh
#
# Copyright (C) 2023 by Nexthink S.A., Switzerland. Any usage, copy or partial copy of
# this code without the explicit agreement of Nexthink S.A. is prohibited and will be
# pursued to the full extend of the law.
#
# The arguments for the script:
# - input script filename
# - output archive filename
# - Certificate owner
# - Prefix
#
# Error handling
set -euo pipefail
trap "echo unrecoverable error !" ERR
# Check codesign
if [[ ! -x /usr/bin/codesign ]]
then
echo "Error: this script requires that codesign is installed"
exit 2
fi
# Check tar
if [[ ! -x /usr/bin/tar ]]
then
echo "Error: this script requires that tar is installed"
exit 2
fi
# Check arguments
if [[ $# -lt 4 ]]
then
echo "Usage: script_signing.sh inputScriptFilename outputArchiveFilename CertificateOwner prefix"
echo "Example: ./script_signing.sh script.sh script.tar.gz \"John Doe\" com.john.remote-action.macos."
exit 1
fi
/usr/bin/codesign -s "$3" --timestamp --prefix="$4" --force "$1"
/usr/bin/tar czf "$2" "$1"
Root CAが生成されたマシンでの署名されたスクリプトのテスト
Root CAが作成された同じマシンで署名されたスクリプトをテストするとき、以下のステップを実行する必要があります。
Root CAをシステムキーチェーンにコピーして信頼済みとしてマークする
Appleはデフォルトで生成されたRoot CAを**「ログイン」キーチェーンに配置します。 しかし、適切な機能を保証するためには、それを「システム」**キーチェーンにインストールする必要があります。
証明書をシステムキーチェーンにコピーするには、次のステップを実行します。
キーチェーンアクセスを開きます。
Root CA証明書を右クリックしてエクスポートを選択してエクスポートします。 ポップアップウィンドウで**証明書(.cer)**ファイル形式を選択します。\

3. **ターミナル**アプリケーションを開きます。 4. Root CAをシステムキーチェーンにインポートするために、次のコマンドを実行します: \ `sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain Certificate.cer` 5. インポート後、証明書が**システム**キーチェーンに表示されることを確認します: - **キーチェーンアクセス**に戻ります。 - 左サイドバーで**システム**セクションを選択します。 - 右上の検索バーを使用して証明書を見つけます。 - 結果テーブルで、**キーチェーン**列が**システム**を表示していることを確認します。 6. Root CA証明書を右クリックし、**情報を見る**を選択して信頼済みにマークします。 - **信頼**セクションで設定を調整してRoot CAを信頼済みとしてマークします。\
<figure><img src="../../../.gitbook/assets/image (193).png" alt=""><figcaption></figcaption></figure>
署名証明書のルートCAをエンドポイントに展開する
Root CAは、以下に示すように、主にJAMFを使用して構成プロファイルを作成することで導入することができます。
Root CAで作成された証明書のエクスポート
ポップアップウィンドウで_証明書(.cer)_ファイル形式を選択します。


上記の構成プロファイルを使用してすべてのエンドポイントに展開します。 ルートCAは自動的に信頼としてマークされます。


証明書がエンドポイントに適切にインポートされたことを確認する
署名済みのリモートアクションスクリプトをendpointにコピーして解凍してください。
tar -xzvf example_ra_script.tar.gz
あなたの署名を確認してください。
codesign -vvvv -R="anchor trusted" example_ra_script.sh
署名証明書のRoot CAが適切にインポートされた場合、次の出力が表示されます:

スクリプトの保守
比較と検証
リモートアクションスクリプトを展開する前に、Nexthinkが準備した他のスクリプトと比較することができます。 このステップはオプションですが、初めてスクリプトを準備する場合は推奨されます。
Nexthink Libraryで、コンテンツを選択してください。
リモートアクションでフィルタリングします。
リモートアクション管理ページに移動してください。
Nexthink Library から直接インストールされたリモートアクションスクリプトの中で、ターゲットオペレーティングシステムに一致するものを選択してください。
スクリプトをエクスポートし、その構文を自分のスクリプトと比較してください。
スクリプトの終了とタイムアウト
リモートアクションスクリプトからサブプロセスを開始し、リモートアクションスクリプトが終了またはタイムアウトすると、Collectorはサブプロセスを自動的に終了します。 リモートアクションが終了した後もサブプロセスを実行し続けるには、&文字を使用してスクリプトがサブプロセスをデタッチすることを確認してください。例:
some_script.sh -arg1 -arg2 &
Zshコマンドインタープリタ
Collectorバージョン6.27.2以降では、Zsh Unixシェル用に書かれたスクリプトを実行できます。 シェルスクリプトの一番最初に以下の行を追加する必要があります:
#!/bin/zsh
これはシバンと呼ばれる文字列です(シバンとは(外部リンク))。
システムがMac上でリモートアクションを実行すると、Collectorはコードの最初の行をチェックし、指定されたインタープリタを使用して残りの指示を実行します。 シバンのないスクリプトは、Bashコマンドインタープリタを使って実行されます。
Last updated
Was this helpful?