Writing scripts for remote actions on Mac
This page details the process of preparing Nexthink remote action scripts on Mac. The scripts are written in Bash, a command-line shell and scripting language supported by many UNIX-like operating systems, and then signed with a certificate for security purposes. Bash scripts are suited for automating tasks and configuration management; They allow remote actions to be run on employee devices.
Remote actions are currently not supported on macOS devices with Mobile Accounts enabled. In this mode, an action may appear successful, but no change is actually applied.
The primary use cases for remote actions include on-demand data collection from devices, self-healing tasks, and modifying configuration settings.
The article assumes that the reader is familiar with Bash scripting.
Refer to the Remote actions group in Community documentation for more information.
Creating the script
Generic scripts and input variables
Generic scripts are useful when a digitally signed script requires customization. Modifying a signed script breaks its signature, but a generic script can be customized by parameters, keeping the signature intact.
Declare parameters at the beginning of a script for Bash positional parameters and enclose them between two special comments as follows:
# NXT_PARAMETERS_BEGIN
Parameter1=$1
Parameter2=$2
Parameter3=$3
# NXT_PARAMETERS_ENDWhen uploading the script during the remote action configuration, the system takes the parameters between the special Nexthink comments in a Bash script. It lists them in the Parameters section below the script text. Provide actual values to the parameters in the text input boxes displayed to the right of each parameter name.
Creating output variables
Executing a script may generate output that you want to store as on-demand data. Nexthink provides a Bash script (nxt_ra_script_output.sh) that is installed on an employee device at the same time as Collector. The script includes functions to write results to the data layer.
To use the functions in the Nexthink script for remote action output, add the following header at the beginning of your Bash scripts:
#!/bin/bash
. "${NEXTHINK}"/bash/nxt_ra_script_output.shAll write methods accept two arguments: the name of the output and the value to write. For instance, if you want to return the number of files in a directory to the data layer, the variable nfiles in your script contains that number. To write the value of nfiles through output with the name FileNumber to the data layer, call the function to write unsigned integers:
nxt_write_output_uint32 'FileNumber' $nfilesThe Remote Actions editor recognizes calls to write outputs in the script and lists the output variables in the Outputs section. Set the output's label to indicate how to refer to it in investigations and metrics.
The ending of each write method indicates the type of output. Because Bash is a loosely typed language, the type of output is interpreted depending on the context. The following is a list of available methods:
nxt_write_output_string
0 - 1024 characters (output truncated if bigger)
nxt_write_output_bool
true / false
nxt_write_output_uint32
Min: 0
Max: 4 294 967 295
nxt_write_output_float
Min: -3.4E+38
Max: 3.4E+38
nxt_write_output_size
Min: 0
Max: 3.4E+38
nxt_write_output_ratio
nxt_write_output_bitrate
nxt_write_output_duration
Min: 0 ms
Max: 49 days
Precision in milliseconds
nxt_write_output_date_time
YYYY-MM-DD HH:MM:SS
nxt_write_output_string_list
0 - 1024 characters (output truncated if bigger)
Defining output fields
When developing scripts, ensure you always:
Predefine the names of all output fields: This ensures that the script populates the correct fields in the output table during execution. Without predefined field names, the script may fail due to an unknown output schema.
Output field names should always be in
stringform.Example:
nxt_write_output_string 'output_field_name' "$output_value"
Define the number of output fields: Your script should always specify a fixed number of output fields. A fixed schema ensures predictable results and compatibility.
Avoid dynamic fields. Dynamic output structures cause inconsistency and potential processing errors in the platform.
Avoid using loops to define output fields when you run the script.
Implementing campaigns
Combine remote actions with campaigns to help employees solve issues independently. Campaigns let you inform employees about the detection of an issue and guide them through its resolution.
To display a campaign on the desktop of an employee who is interacting with a device:
The campaign must have a Remote action trigger and be published.
The script of the remote action can be executed either:
In the context of the employee, if the action does not need any special privileges.
In the context of the local system account, if the action needs administrative privileges.
Obtaining a campaign identifier
The methods to run a campaign from a remote action require a campaign identifier to be passed as an argument. You can use both the campaign NQL ID (recommended) and the campaign UID (classic option).
Support for the NQL ID as an identifier requires Collector version 23.5 or later.To pass the campaign identifier to a remote action, declare a parameter in the script of the remote action for each required campaign. Use the NQL ID (or UID) as the actual value for the parameter when editing the remote action.
For more information on how to get the NQL ID or the UID of a campaign, refer to the Triggering a campaign documentation.
Running a campaign from the script of a remote action
The following functions extend the scripting capabilities of remote actions.
nxt_run_campaign( id )The function runs the campaign matching the NQL ID (preferred) or UID passed as a parameter and saves the answers internally.
The function returns 0 if the campaign status is received.
The function returns 1 in all other cases, and the error is reported in the logs.
Calling the function pauses the execution of the remote action until the employee either completes the campaign or dismisses it.
nxt_run_campaign_with_timeout( id timeout)The function runs the campaign matching the NQL ID (preferred) or UID with the timeout in seconds (0 < T < 1 week) passed as a parameter, and saves the answers internally.
The function returns 0 if the campaign status is received.
The function returns 1 in all other cases, and the error is reported in the logs.
Calling the function pauses the execution of the remote action until the employee either completes the campaign, dismisses it or fails to finalize the campaign before the timeout.
nxt_run_standalone_campaign( id )The function runs the campaign matching the NQL ID (preferred) or UID passed as a parameter and saves the answers internally.
The function returns 0 if the campaign status is received.
The function returns 1 in all other cases, and the error is reported in the logs.
Calling the function triggers the start of the campaign and continues the execution of the remote action without waiting for the employee's answers.
nxt_get_campaign_status( res_var )The function:
Returns 0 if the campaign status is stored successfully in
res_var.Returns 1 otherwise.
It then extracts the campaign status as a string value and saves it in the given variable res_var . If the function returns with 0 result, res_var has one of the following values :
fully: the employee has fully answered the campaign questions.
timeout: the campaign was timed out before the user finished answering.
postponed: the employee agreed to participate in the campaign.
declined: the employee declined to participate in the campaign.
connectionfailed: the script was unable to connect to the Collector component that controls campaign notifications.
notificationfailed: the script was unable to display the campaign successfully due to one of the following:
The campaign definition could not be retrieved from the platform because of a non-existent campaign or a non-published campaign.
Another campaign is already being displayed to the employee.
A non-urgent campaign cannot be shown due to the focus protection or do-not-disturb rules of Collector. Refer to the Limiting the reception rate of campaigns documentation for more information.
Empty if the last campaign failed.
nxt_get_response_answer( res_var question_key)Query the last campaign using a question label as a string parameter query_key. The function extracts the answer as a string value and saves it in the given variable res_var.
Returns 0 if the campaign answer is stored successfully in
res_var.Returns 1 otherwise.
Encoding the script
To write Bash scripts for remote actions:
Encode the files that contain the script in UTF-8, without BOM.
End each line in the code with the usual character in UNIX systems:
LF.
Ensure proper encoding to avoid errors or nonfunctioning scripts.
Code examples
Signing the script
Maintaining the script
Comparison and validation
Before deploying a remote action script, it is possible to compare it with other scripts prepared by Nexthink. This step is optional but recommended if it is your first time preparing a script.
In the Nexthink Library, select Content.
Filter by Remote action.
Navigate to the Remote Actions management page.
Select any remote action script installed directly from the Nexthink Library that matches the target operating system.
Export the script and compare its syntax with your script’s.
Script termination and timeout
When launching subprocesses from your remote action script and the remote action script terminates or times out, Collector terminates the subprocesses automatically. If you want the subprocess to continue executing after the remote action is terminated, ensure that your script detaches the subprocess using the & character, for example:
some_script.sh -arg1 -arg2 &Zsh command interpreter
Starting with Collector version 6.27.2, you can run scripts written for the Zsh Unix shell. You must add the following line of code at the very beginning of the shell script:
#!/bin/zshThis is a character sequence known as a shebang (external link).
When the system triggers a remote action on a Mac, Collector checks the first line of code and executes the rest of the instructions using the specified interpreter. A script without a shebang will be executed using the Bash command interpreter.
Last updated
Was this helpful?






















