{"id":11575,"date":"2020-09-28T22:20:41","date_gmt":"2020-09-28T16:50:41","guid":{"rendered":"http:\/\/kalilinuxtutorials.com\/?p=11575"},"modified":"2020-09-28T22:20:41","modified_gmt":"2020-09-28T16:50:41","slug":"using-bulk-scripting-with-remote-it","status":"publish","type":"post","link":"https:\/\/kalilinuxtutorials.com\/using-bulk-scripting-with-remote-it\/","title":{"rendered":"Using Bulk Scripting With remote.it"},"content":{"rendered":"\n<p>If you\u2019re managing a fleet of devices (endpoints), you run into the challenge of managing and updating those devices without exposing your endpoints to attacks from hackers. You can create secure connections to your devices or even a secure virtual private internet of private connections using <a href=\"https:\/\/www.remote.it\/?utm_source=kalilinuxarticle&amp;utm_medium=web&amp;utm_campaign=web_article\">remote.it<\/a>, but it can still be tedious to update hundreds or thousands of devices unless you have a tool for executing bulk commands for those devices.<\/p>\n\n\n\n<p>remote.it can make your life easier with a feature called \u201cBulk Scripting\u201d.<\/p>\n\n\n\n<p>Bulk Scripting allows you to run a script (written in any interpreted language you have installed on your Operating System) on any number of devices. This powerful feature takes away a lot of the drudgery and repetitiveness involved in managing thousands of devices in the field. You can also use it to retrieve information and present that information in the remote.it web portal.<\/p>\n\n\n\n<p>Q: When should you use a script?<\/p>\n\n\n\n<p>A: When you have a repetitive action that you would like to perform on one or more devices.<\/p>\n\n\n\n<p>Q: what should I know to get the most out of <a href=\"http:\/\/remotee.it\">remote.it<\/a> Bulk Scripting?<\/p>\n\n\n\n<p>A: Linux command line utilities such as the following, or their equivalents in another interpreted language such as Python.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>grep<\/li><li>awk<\/li><li>tail<\/li><li>head<\/li><li>getopts<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Instructions<\/strong><\/h2>\n\n\n\n<ol class=\"wp-block-list\"><li>Start with a script (bash, sh, Python, PHP, etc.) that works properly on a single device.<\/li><li>Find a sample script that is closest to what your script does<\/li><li>Edit your original script to include the hooks required for it to operate correctly in the <a href=\"http:\/\/remote.it\">remote.it<\/a> Bulk Scripting feature.<\/li><li>Upload your Bulk Script to your account<\/li><li>Select a set of Devices to run your Bulk Script on<\/li><li>Execute the Bulk Script using the &#8220;Actions&#8221; Menu<\/li><li>If any interactive parameters have been set using the r3_header, answer them when prompted<\/li><li>The scripting Job Server sends a command to the Bulk Service on each Device in the selected set, including:<ol><li>Task ID<\/li><li>Job Server API<\/li><li>Short code, which is used to reconstruct the command line with the interactive parameters<\/li><\/ol><\/li><li>The Server Channel daemon downloads the script, makes it executable, and runs it, with the 3 parameters above passed on the command line.<\/li><li>The script runs the commands and sends any Status Column data back using <strong>connectd_task_notify. connectd_task_notify<\/strong> is a required utility script for bulk scripting that is included in both the<strong> connectd <\/strong>and <strong>remoteit <\/strong>packages.<\/li><li>The script terminates, with either a &#8220;Success&#8221; or &#8220;Failed&#8221; code, again using <strong>connectd_task_notify<\/strong><\/li><\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Features<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Reporting status to Status Columns A &#8211; E<\/strong><\/h3>\n\n\n\n<p>The sample script can be downloaded by following <a href=\"https:\/\/support.remote.it\/hc\/en-us\/articles\/360046825331-Example-show-device-status\">this link<\/a> and looking for the attachment at the bottom of the page.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/qmcnXx6vSorC5DpUERWfnCVtrp5cmbr0pS_6Q8hOI4sQN8WsNIhEqbRyg2J9xAr3ndiejGy9XaEgnm8bTaedz-4fqIeP1BazV5EY19UrQEcX8Pyy6i9GCPmFjP7vzj90uYoicDgF8J9KKzjM9Q\" alt=\"\"\/><\/figure>\n\n\n\n<p>When you are on the \u201cDevices\u201d page, and have \u201cshow Advanced Columns\u201d selected, you will see columns marked \u201cStatusA\u201d through \u201cStatusE\u201d. These columns can be updated with values read from your remote devices.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/O6nxD-xvg1wYxe4rIGSeakKjsVXLyYFhFauCLENuhCmQZObCJPOJI2rhFmx9h3fOyewyIlnlDrouYf-Gyv5K4I2eMvU2UvbBLS1J8495HYv0tEsVwZY_gNVITnnnnhTlhoKRHrb39fTzuuyuaA\" alt=\"\"\/><\/figure>\n\n\n\n<p>This example reads different variables from the Pi and formats them into strings which are displayed in the status columns.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/f3iu01s52WS9oG4UzXbQi-gcfW9qTrPghHwCWdUZ8s7_FKTJ38Cqsb8yJnlTK1V4JAbApC1mm1vbXzmDMLI4IVVx_53XGVW2gU16n6IziTE24yFDUMwV20TznZuydPSlvCifKzJErVYI0XdKhA\" alt=\"\"\/><\/figure>\n\n\n\n<p>Status A = the value of the <strong>os<\/strong> variable, which we have set as follows:<\/p>\n\n\n\n<p>os=$(cat \/etc\/os-release | grep -w ID | awk -F &#8220;=&#8221; &#8216;{print $2 }&#8217;)<br>Status B = the value of the <strong>fwversion<\/strong> variable:<br>fwversion=$(uname -a)<br>Status C = the value of the <strong>uptime<\/strong> variable:<br>uptime=$(uptime | sed &#8216;s\/^.*up *\/\/; s\/, *[0-9]* user.*$\/m\/; s\/day[^0-9]*\/d, \/;s\/\\([hm]\\).*m$\/\\1\/;s\/:\/h, \/;s\/^\/\/&#8217;)<br>Status D = the value of the <strong>nsvcs<\/strong> variable:<br>nsvcs=$(ps ax | grep connect | grep -v grep | wc -l)<\/p>\n\n\n\n<p>This counts how many remoteit connection services have been installed.<\/p>\n\n\n\n<p>Status E = the value of the <strong>cversion<\/strong> variable:<br>cversion=$(dpkg -s $package | grep Version)<\/p>\n\n\n\n<p>The package variable was set earlier in the script by looking for certain files which we know are part of either the <strong>remoteit<\/strong> or <strong>connectd<\/strong> packages.<\/p>\n\n\n\n<p>These expressions may not be particularly useful to you as is, but are simply given as examples of how to find and format expressions to be sent to the Status columns.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Sending parameters to your script at run time<\/strong><\/h3>\n\n\n\n<p>In addition to triggering actions and retrieving per-device information, you can enhance the flexibility of your scripts by including some interactivity between the time that you select the script to be run, and the script being sent to the selected group of devices. Unlike scripts which you run on the command line, <a href=\"http:\/\/remote.it\">remote.it<\/a> bulk scripts do not allow you to guide the flow interactively after the script starts.&nbsp;<\/p>\n\n\n\n<p><a href=\"http:\/\/remote.it\">remote.it<\/a> script parameters are essentially the same as command line parameters which you pass in at the time you type in the command. These are defined by a special comment, the \u201cr3_header\u201d line, near the top of your script.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Sending a string to your script<\/strong><\/h2>\n\n\n\n<p>The sample script script can be downloaded by following <a href=\"https:\/\/support.remote.it\/hc\/en-us\/articles\/360046468752-Using-s-to-prompt-for-a-string\">this link<\/a> and looking for the attachment at the bottom of the page.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/p-fVE-FbqK8tG4ZMYe5cFZq2emOKzcgpPiY_S6SnvsHjG9CTU4QwfYg1l6Zu308Vl3SS1UEyG_IqbmNVrZamIqebhGdeeTVZTsQChCFaJcvq_EsgL6ZuurKkpHKAX7FwaQw-jGbpUa9eaiPZ_A\" alt=\"\"\/><\/figure>\n\n\n\n<p>Use the \u201c-s\u201d option with your script to ask for a general purpose string to be passed to your script.<br>The r3_header line:<br># r3_header, -s (Enter command)<\/p>\n\n\n\n<p>results in the following interactive dialog appearing when you execute the program:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/tr0glMJOMLb_IiKcJO5qaEDzgEXtEtGwqgZFbCQlnaG80umkUIBjGkK6_deE67BnoJb0QJEEIN78nuDzYFXrk1bDZsQYbHGIafc_Sfchd9adUwKjQQt_2Y2ZHtPLwhnHlRnCTW3Jv4Tg4pAhyw\" alt=\"\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Getting the information from the &#8220;-s&#8221; flag<\/strong><\/h2>\n\n\n\n<p>Look for the following section near the end of the script.&nbsp; The string parameter is base64 encoded by the Job Server and so must be base64 decoded in order to be used.<\/p>\n\n\n\n<p>################################################<\/p>\n\n\n\n<p># parse the flag options (and their arguments) #<\/p>\n\n\n\n<p>################################################<\/p>\n\n\n\n<p>while getopts s: OPT; do<br>case &#8220;$OPT&#8221; in<br>&nbsp;s)<br>                     Log &#8220;OPTARG=$OPTARG&#8221;<br>                    &nbsp;commandString=$(echo &#8220;$OPTARG&#8221; | base64 &#8211;decode)<br>                     Log &#8220;Command: $commandString&#8221;<br>                    Status_A &#8220;Command:\\n$commandString&#8221;<br> ;;<br>esac<br>done<\/p>\n\n\n\n<p>#===============================================================================<\/p>\n\n\n\n<p># down here we are executing the string on the command line, then sending status back about the command.<\/p>\n\n\n\n<p># users can choose to do other things here, such as doing something else with the string.<\/p>\n\n\n\n<p>output=$($commandString)<\/p>\n\n\n\n<p>For example, suppose I want to list the files in the \/tmp folder using the command:<\/p>\n\n\n\n<p>ls -l \/tmp<\/p>\n\n\n\n<p>When I execute this script, I type the command when prompted:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/UkfyNR81neVtzCIw8vnGhVQJRjHliocXG9i6Do229J2umql2lFUcmNFPOEsfS7HDseqL9YaXfmaDn2jB9hXUI1vMx_EUQE0q-Z0HXe0haa4RW_oqC5nEKcReKJrcqJiQvk6u2P3VrxKjCy81gg\" alt=\"\"\/><\/figure>\n\n\n\n<p>Then, check the checkbox to get updates as they happen:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/nXZS6b8Lex7c_eMevhrHPJspIKOt0qiNoyR5ynO--JkRNVNtCTfYjuRYSFQk2TwgxavI-QVGIslIoNCVMK5X8iHfRXOGLVNpXxZuGrLWgFpVqRQqtc_lnCU126YLQhjtZyj2wHosFW-NwDtWTw\" alt=\"\"\/><\/figure>\n\n\n\n<p>After a few seconds, the status cells A and B fill in as shown:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/kc1r86bxJZzP0MRTSyvVGYXkH3jJr96-uASSjbJmD5CZqNyOo0tqPnPaywE0HQbyQj7-9UiRG8FDh8vEhDwnq2_zMAaEUpzknZtjmy3ehBVKcFymQPUsnT1oEx9tw2f3ZuZ9Z_mWwyBHJPBeqQ\" alt=\"\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Choosing from a list of options to send a string to your script<\/strong><\/h2>\n\n\n\n<p>The sample script script can be downloaded by following <a href=\"https:\/\/support.remote.it\/hc\/en-us\/articles\/360046500812-Using-l-to-ask-user-to-choose-from-a-list-of-pre-defined-options\">this link<\/a> and looking for the attachment at the bottom of the page.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/HOgaEEGPECf4yJRPFPDSaSMlQezRt7MZw7zmkjmf1k5da7YRQ4JSbkn7hKXf2MEfBMeIGcE2-tiPLpaQNHiVzQJ0doU9Rrv4l_T2pMT2OWAB5_MeTUulH4WvWDCnniiStWih2x_KtlrFSx_TCg\" alt=\"\"\/><\/figure>\n\n\n\n<p>Use the \u201c-l\u201d option with your script to ask for a string selected from a predetermined list to be passed to your script.<\/p>\n\n\n\n<p>The r3_header line:<\/p>\n\n\n\n<p># r3_header, -l (Dummy|Choose Action|Cloak SSH|Uncloak SSH)<\/p>\n\n\n\n<p>results in the following interactive dialog appearing when you execute the program:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/K5QGEuHc7F6sK0DXs2uA0K-lbPeD8s4Md0VOE68Xk0pcehZYrGYryqb4HyK43f0aRwyY308EnixsL2CdowinuMaKmB-6VS8-JlNK164hzq7_wk8kKAnT8tYDVxiDZSsNZnZORF51LffcLeNBBw\" alt=\"\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Getting the information from the &#8220;-l&#8221; flag<\/strong><\/h3>\n\n\n\n<p>Look for the following section near the end of the script.<\/p>\n\n\n\n<p>################################################<\/p>\n\n\n\n<p># parse the flag options (and their arguments) #<\/p>\n\n\n\n<p>################################################<\/p>\n\n\n\n<p>while getopts l: OPT; do<br>case &#8220;$OPT&#8221; in<br>l)<br># option selected from list in r3-header<br>\u00a0Log &#8220;(l) $OPTARG&#8221;<br>action=$(echo &#8220;$OPTARG&#8221;<br>\u00a0;;<br>\u00a0*)<br>Log &#8220;$OPT&#8221;<br>;;<br>\u00a0esac<br>done<\/p>\n\n\n\n<p>At the end of the &#8220;getopts&#8221; loop, the string corresponding to the selection you made will be in the variable.&nbsp; Then you simply compare that to the known options and execute the appropriate commands.&nbsp;<\/p>\n\n\n\n<p>if [ &#8220;$action&#8221; == &#8220;Cloak SSH&#8221; ]; then<br>cloakSSH<br>elif [ &#8220;$action&#8221; == &#8220;Uncloak SSH&#8221; ]; then<br>\u00a0uncloakSSH<br>fi<\/p>\n\n\n\n<p>This example allows you to cloak or uncloak the SSH server on a Raspberry Pi running Raspbian or Raspberry Pi OS.&nbsp; Finally, the results of the script are shown in the status cells.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/WGLqIfvbNGGZr28ZpUqnfwfjH2xGz5ed0qihhvLGKFu38BVN7N6K3Hzu8VMGjIVshxO4SorCPOTB8d3aERZIUKieRB6aAO0SG_0U1nkkbxqCSoRlEINrE8vVvhuc0reVL_MRgOMSBj99lUl0Yw\" alt=\"\"\/><\/figure>\n\n\n\n<p>========<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Sending a file to your script<\/strong><\/h3>\n\n\n\n<p>The sample script can be downloaded by following <a href=\"https:\/\/support.remote.it\/hc\/en-us\/articles\/360046825951-Using-f-to-prompt-for-a-file-to-send\">this link<\/a> and looking for the attachment at the bottom of the page.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/rhMJXlFCwpZxMCcVtBq1rPpiedhB4yOBZCgOAd9KAt0MNkn_xvz9Vvyg_RDFffSB-OOT4ethAiXoy1fztuYa91NyhQhOILfIyeCgLq925Y6HVfm3QVj-mTyQz0bwmnmbkpqRc39t-ktDmgrSZA\" alt=\"\"\/><\/figure>\n\n\n\n<p>Use the \u201c-f\u201d option with your script to ask for a link to download a file which you had uploaded to your general purpose storage to be passed to your script.<\/p>\n\n\n\n<p>The r3_header line:<br># r3_header, -f (Select File|.)<br>The information in parentheses should be interpreted as:<br>( Prompt string | file spec )<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Prompt string = &#8220;Quotes enclosed string to display when the dialog is shown&#8221;<\/li><li>File spec = which files to show in the selection list.<ul><li>. =&gt; *.* (all files)<\/li><li>.zip =&gt; *.zip<\/li><\/ul><\/li><\/ul>\n\n\n\n<p>The given example shows the following dialog when you run &#8220;Execute Script&#8221;.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/NHQWbj8Fn3DP5EHJ0Tpe17UaF1D7ILv8AivhP3EHf5Ge9mZMOuPIQpm_a4xfBqJHgb6HQD17ljZfTS-VCSwjaARaG23Jx0TZ2mowQKJYxZP3hAdwE0ugGSozglg_62u6bD3xlAv_XV4ZVc1pNg\" alt=\"\"\/><\/figure>\n\n\n\n<p>Note that you can also enter a file URL here (e.g. a Dropbox file download URL).&nbsp; This will be used later on in the script.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Getting the information from the &#8220;-f&#8221; flag<\/strong><\/h2>\n\n\n\n<p>Look for the following section near the end of the script.<\/p>\n\n\n\n<p>################################################<\/p>\n\n\n\n<p># parse the flag options (and their arguments) #<\/p>\n\n\n\n<p>################################################<\/p>\n\n\n\n<p>while getopts f: OPT; do<br>case &#8220;$OPT&#8221; in<br>\u00a0f)<br>\u00a0# get file, this should be in the format &#8220;file -O output file&#8221;<br>filename=$(echo $OPTARG | awk &#8216;{ print $3 }&#8217;)<br>\u00a0newfilename=$(echo $filename | sed s\/%20\/&#8221;&#8221;\/g)<br>\u00a0Status_A &#8220;Downloading $newfilename&#8230;&#8221;<br>Log &#8220;Downloading $newfilename&#8230;&#8221;<br>Task_Update &#8220;Downloading $newfilename&#8230;&#8221;<br>Download_With_Retry &#8220;$OPTARG&#8221; &#8220;$LIMIT_SPEED&#8221;<br>Log &#8220;newfilename: $newfilename&#8230;&#8221;<br>mv &#8220;$filename&#8221; &#8220;$newfilename&#8221;<br>Task_Update &#8220;Downloaded $newfilename&#8221;\u00a0<br>\u00a0\u00a0;;<br>\u00a0esac<br>done<\/p>\n\n\n\n<p>In this script, the following line removes any spaces in the file name.<\/p>\n\n\n\n<p>&nbsp;newfilename=$(echo $filename | sed s\/%20\/&#8221;&#8221;\/g)<\/p>\n\n\n\n<p>At the end of the &#8220;getopts&#8221; loop, the file will have been downloaded into the \/tmp folder.&nbsp; At this point, you can do anything you want with the file.&nbsp; This example just gets the file size in bytes and the MD5 checksum and reports those values back to the Status cells.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Using multiple command line options<\/strong><\/h2>\n\n\n\n<p>You can combine multiple flags for command line parameters by separating them with commas, as shown. The dialogs will appear in the order they are defined, left to right. Here we have combined the two examples for \u201csend a file from your account storage\u201d and \u201csend an arbitrary string\u201d.<\/p>\n\n\n\n<p># r3_header, -f (Select File|.), -s (Enter command)<\/p>\n\n\n\n<p>You\u2019ll then need to update the getopts loop to include all of the options and case statements to process each choice.<\/p>\n\n\n\n<p>################################################<\/p>\n\n\n\n<p># parse the flag options (and their arguments) #<\/p>\n\n\n\n<p>################################################<\/p>\n\n\n\n<p>while getopts f:s: OPT; do<br>case &#8220;$OPT&#8221; in<br>f)<br>\u00a0# get file, this should be in the format &#8220;file -O output file&#8221;<br>filename=$(echo $OPTARG | awk &#8216;{ print $3 }&#8217;)<br>\u00a0newfilename=$(echo $filename | sed s\/%20\/&#8221;&#8221;\/g)<br>\u00a0Status_A &#8220;Downloading $newfilename&#8230;&#8221;<br>Log &#8220;Downloading $newfilename&#8230;&#8221;<br>Task_Update &#8220;Downloading $newfilename&#8230;&#8221;<br>Download_With_Retry &#8220;$OPTARG&#8221; &#8220;$LIMIT_SPEED&#8221;<br>Log &#8220;newfilename: $newfilename&#8230;&#8221;<br>\u00a0mv &#8220;$filename&#8221; &#8220;$newfilename&#8221;<br>\u00a0Task_Update &#8220;Downloaded $newfilename&#8221;\u00a0<br>\u00a0;;<br>\u00a0s)<br>\u00a0Log &#8220;OPTARG=$OPTARG&#8221;<br>commandString=$(echo &#8220;$OPTARG&#8221; | base64 &#8211;decode)<br>\u00a0Log &#8220;Command: $commandString&#8221;<br>\u00a0Status_B &#8220;Command:\\n$commandString&#8221;<br>;;<br>esac<br>done<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Strategies for debugging <\/strong><a href=\"http:\/\/remote.it\"><strong>remote.it<\/strong><\/a><strong> Bulk Scripts<\/strong><\/h2>\n\n\n\n<p>Even the most basic scripts should have a call at the end to &#8220;connectd_task_notify&#8221;.<\/p>\n\n\n\n<p>connectd_task_notify is part of the connectd package and gets installed to \/usr\/bin.&nbsp; Its only purpose is to communicate from a Device Script back to our job servers to:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Display status info into status cells (optional)<\/li><li>Keep track of job execution status, primarily completed &#8220;OK&#8221; and completed with an identified failure.<\/li><\/ul>\n\n\n\n<p>Some of the supplied sample scripts may do this indirectly by calling a &#8220;Job_Complete&#8221; function, but look for that and you should see a call to connectd_task_notify.<\/p>\n\n\n\n<p>If you need your scripts to work with both connectd and systems using the older deprecated weavedconnectd package, please see:&nbsp;&nbsp;<a href=\"https:\/\/forum.remote.it\/t\/making-scripts-work-with-connectd-and-weavedconnectd\/48\">https:\/\/forum.remote.it\/t\/making-scripts-work-with-connectd-and-weavedconnectd\/48<\/a><\/p>\n\n\n\n<p>If your script crashes or exits prior to executing the final call to connectd_task_notify, then those tasks will stay in &#8220;running&#8221; mode until you cancel the job.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>ssh to target<\/strong><\/h3>\n\n\n\n<p>If you have a script which is misbehaving, it is often quite helpful to SSH to the target device while you run the script as you can often see messages displayed on the console indicating what has happened.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>log results for review<\/strong><\/h3>\n\n\n\n<p>Another very helpful strategy is to log results from your script for you to review later.&nbsp; You can use the Linux &#8220;logger&#8221; command to send messages to the system log, or you can use a command such as:<\/p>\n\n\n\n<p><em>echo &#8220;$variable&#8221; &gt;&gt; $0.log<\/em><\/p>\n\n\n\n<p>Supposing your script ws called &#8220;file_copy.sh&#8221; then your log messages would accumulate in the file:<\/p>\n\n\n\n<p><em>\/tmp\/file_copy.sh.log<\/em><\/p>\n\n\n\n<p>Sending log messages to the system log using &#8220;logger&#8221; has the advantage that the debug messages will still be there after a reboot and you can see how your script execution relates to other system events that use the log (if that&#8217;s helpful).&nbsp; On the downside, you usually will want to use &#8220;grep&#8221; to filter out your messages.<\/p>\n\n\n\n<p>Sending messages to a temporary log file has the advantage of only including the info you send, so it may be easier to zero in on the info you are looking for.&nbsp; The possible downsides include the fact that files in \/tmp disappear when your system reboots.<\/p>\n\n\n\n<p>You can use both methods at once if desired.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Common problems encountered when developing <\/strong><a href=\"http:\/\/remote.it\"><strong>remote.it<\/strong><\/a><strong> Bulk Scripts<\/strong><\/h2>\n\n\n\n<ol class=\"wp-block-list\"><li>The schannel (in <strong>connectd<\/strong>) or remoteit (in <strong>remoteit<\/strong>) daemon may not be running.&nbsp; Connect through the console (SSH or keyboard\/monitor) and confirm with:<\/li><\/ol>\n\n\n\n<p>ps ax | grep schannel<\/p>\n\n\n\n<p>or<\/p>\n\n\n\n<p>ps ax | grep remoteit<\/p>\n\n\n\n<p>2. If you are on Windows, editing and saving your script in Notepad will cause issues because the line feeds are not compatible with your Pi Linux OS. We suggest you use a Linux compatible text editor for Windows such as&nbsp;<a href=\"https:\/\/notepad-plus-plus.org\/\">Notepad++<\/a>.<\/p>\n\n\n\n<p>Make sure EOL encoding is set to UNIX (LF):<\/p>\n\n\n\n<p>3. The PATH may not be set correctly in your script.&nbsp; The PATH available to the bulk script execution environment is not the same as you would get logging in, even as root.&nbsp; This can prevent commands which call other commands from working properly, even if you supply explicit paths for everything.<\/p>\n\n\n\n<p>Add this statement to your scripts near (but not at) the top:<\/p>\n\n\n\n<p>export PATH=$PATH:\/usr\/local\/sbin:\/usr\/local\/bin:\/usr\/sbin:\/usr\/bin:\/sbin:\/bin<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Additional resources<\/strong><\/h2>\n\n\n\n<p><a href=\"https:\/\/support.remote.it\/hc\/en-us\/categories\/360003803911-Bulk-Scripting\">Bulk Scripting at the remote.it Help Center<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/support.remote.it\/hc\/en-us\/sections\/360009833591-Advanced-Bulk-Scripting-and-debugging\">Advanced Bulk Scripting and Debugging<\/a><\/p>\n\n\n\n<p>Questions or problems? Send an e-mail to s<a href=\"mailto:support@remote.it\">upport@remote.it.<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>If you\u2019re managing a fleet of devices (endpoints), you run into the challenge of managing and updating those devices without exposing your endpoints to attacks from hackers. You can create secure connections to your devices or even a secure virtual private internet of private connections using remote.it, but it can still be tedious to update [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":16533,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/1.bp.blogspot.com\/-a4Au9_k1Rj0\/X3S4BcAloKI\/AAAAAAAAKnc\/r0YsTTgazkEhI5pQbKiWaU_GxSLl2kQHQCLcBGAsYHQ\/s16000\/Scripting.png","fifu_image_alt":"Using Bulk Scripting With Remote.it","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[19],"tags":[],"class_list":["post-11575","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Using Bulk Scripting With remote.it - Kali Linux Tutorials<\/title>\n<meta name=\"robots\" content=\"noindex, follow\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Using Bulk Scripting With remote.it - Kali Linux Tutorials\" \/>\n<meta property=\"og:description\" content=\"If you\u2019re managing a fleet of devices (endpoints), you run into the challenge of managing and updating those devices without exposing your endpoints to attacks from hackers. You can create secure connections to your devices or even a secure virtual private internet of private connections using remote.it, but it can still be tedious to update [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kalilinuxtutorials.com\/using-bulk-scripting-with-remote-it\/\" \/>\n<meta property=\"og:site_name\" content=\"Kali Linux Tutorials\" \/>\n<meta property=\"article:published_time\" content=\"2020-09-28T16:50:41+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/1.bp.blogspot.com\/-a4Au9_k1Rj0\/X3S4BcAloKI\/AAAAAAAAKnc\/r0YsTTgazkEhI5pQbKiWaU_GxSLl2kQHQCLcBGAsYHQ\/s16000\/Scripting.png\" \/>\n<meta name=\"author\" content=\"Balaji N\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/1.bp.blogspot.com\/-a4Au9_k1Rj0\/X3S4BcAloKI\/AAAAAAAAKnc\/r0YsTTgazkEhI5pQbKiWaU_GxSLl2kQHQCLcBGAsYHQ\/s16000\/Scripting.png\" \/>\n<meta name=\"twitter:creator\" content=\"@CyberEdition\" \/>\n<meta name=\"twitter:site\" content=\"@CyberEdition\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Balaji N\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kalilinuxtutorials.com\/using-bulk-scripting-with-remote-it\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kalilinuxtutorials.com\/using-bulk-scripting-with-remote-it\/\"},\"author\":{\"name\":\"Balaji N\",\"@id\":\"https:\/\/kalilinuxtutorials.com\/#\/schema\/person\/60a7ca200659320919e000590b4f7c3a\"},\"headline\":\"Using Bulk Scripting With remote.it\",\"datePublished\":\"2020-09-28T16:50:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kalilinuxtutorials.com\/using-bulk-scripting-with-remote-it\/\"},\"wordCount\":2293,\"publisher\":{\"@id\":\"https:\/\/kalilinuxtutorials.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/kalilinuxtutorials.com\/using-bulk-scripting-with-remote-it\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/1.bp.blogspot.com\/-a4Au9_k1Rj0\/X3S4BcAloKI\/AAAAAAAAKnc\/r0YsTTgazkEhI5pQbKiWaU_GxSLl2kQHQCLcBGAsYHQ\/s16000\/Scripting.png\",\"articleSection\":[\"Blog\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kalilinuxtutorials.com\/using-bulk-scripting-with-remote-it\/\",\"url\":\"https:\/\/kalilinuxtutorials.com\/using-bulk-scripting-with-remote-it\/\",\"name\":\"Using Bulk Scripting With remote.it - Kali Linux Tutorials\",\"isPartOf\":{\"@id\":\"https:\/\/kalilinuxtutorials.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kalilinuxtutorials.com\/using-bulk-scripting-with-remote-it\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kalilinuxtutorials.com\/using-bulk-scripting-with-remote-it\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/1.bp.blogspot.com\/-a4Au9_k1Rj0\/X3S4BcAloKI\/AAAAAAAAKnc\/r0YsTTgazkEhI5pQbKiWaU_GxSLl2kQHQCLcBGAsYHQ\/s16000\/Scripting.png\",\"datePublished\":\"2020-09-28T16:50:41+00:00\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kalilinuxtutorials.com\/using-bulk-scripting-with-remote-it\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/kalilinuxtutorials.com\/using-bulk-scripting-with-remote-it\/#primaryimage\",\"url\":\"https:\/\/1.bp.blogspot.com\/-a4Au9_k1Rj0\/X3S4BcAloKI\/AAAAAAAAKnc\/r0YsTTgazkEhI5pQbKiWaU_GxSLl2kQHQCLcBGAsYHQ\/s16000\/Scripting.png\",\"contentUrl\":\"https:\/\/1.bp.blogspot.com\/-a4Au9_k1Rj0\/X3S4BcAloKI\/AAAAAAAAKnc\/r0YsTTgazkEhI5pQbKiWaU_GxSLl2kQHQCLcBGAsYHQ\/s16000\/Scripting.png\"},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kalilinuxtutorials.com\/#website\",\"url\":\"https:\/\/kalilinuxtutorials.com\/\",\"name\":\"Kali Linux Tutorials\",\"description\":\"Kali Linux Tutorials\",\"publisher\":{\"@id\":\"https:\/\/kalilinuxtutorials.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kalilinuxtutorials.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kalilinuxtutorials.com\/#organization\",\"name\":\"Kali Linux Tutorials\",\"url\":\"https:\/\/kalilinuxtutorials.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/kalilinuxtutorials.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kalilinuxtutorials.com\/wp-content\/uploads\/2025\/07\/Kali.png\",\"contentUrl\":\"https:\/\/kalilinuxtutorials.com\/wp-content\/uploads\/2025\/07\/Kali.png\",\"width\":272,\"height\":90,\"caption\":\"Kali Linux Tutorials\"},\"image\":{\"@id\":\"https:\/\/kalilinuxtutorials.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/CyberEdition\",\"https:\/\/www.threads.com\/@cybersecurityedition\",\"https:\/\/www.linkedin.com\/company\/cyberedition\",\"https:\/\/www.instagram.com\/cybersecurityedition\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kalilinuxtutorials.com\/#\/schema\/person\/60a7ca200659320919e000590b4f7c3a\",\"name\":\"Balaji N\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/kalilinuxtutorials.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/731b188cc4b41a930b86edb5b329269c4eb591acf245f8e5fc318f42b517ff2a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/731b188cc4b41a930b86edb5b329269c4eb591acf245f8e5fc318f42b517ff2a?s=96&d=mm&r=g\",\"caption\":\"Balaji N\"},\"description\":\"Balaji is an Editor-in-Chief &amp; Co-Founder - Cyber Security News, GBHackers On Security &amp; Kali Linux Tutorials.\",\"url\":\"https:\/\/kalilinuxtutorials.com\/author\/balaji\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Using Bulk Scripting With remote.it - Kali Linux Tutorials","robots":{"index":"noindex","follow":"follow"},"og_locale":"en_US","og_type":"article","og_title":"Using Bulk Scripting With remote.it - Kali Linux Tutorials","og_description":"If you\u2019re managing a fleet of devices (endpoints), you run into the challenge of managing and updating those devices without exposing your endpoints to attacks from hackers. You can create secure connections to your devices or even a secure virtual private internet of private connections using remote.it, but it can still be tedious to update [&hellip;]","og_url":"https:\/\/kalilinuxtutorials.com\/using-bulk-scripting-with-remote-it\/","og_site_name":"Kali Linux Tutorials","article_published_time":"2020-09-28T16:50:41+00:00","og_image":[{"url":"https:\/\/1.bp.blogspot.com\/-a4Au9_k1Rj0\/X3S4BcAloKI\/AAAAAAAAKnc\/r0YsTTgazkEhI5pQbKiWaU_GxSLl2kQHQCLcBGAsYHQ\/s16000\/Scripting.png","type":"","width":"","height":""}],"author":"Balaji N","twitter_card":"summary_large_image","twitter_image":"https:\/\/1.bp.blogspot.com\/-a4Au9_k1Rj0\/X3S4BcAloKI\/AAAAAAAAKnc\/r0YsTTgazkEhI5pQbKiWaU_GxSLl2kQHQCLcBGAsYHQ\/s16000\/Scripting.png","twitter_creator":"@CyberEdition","twitter_site":"@CyberEdition","twitter_misc":{"Written by":"Balaji N","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kalilinuxtutorials.com\/using-bulk-scripting-with-remote-it\/#article","isPartOf":{"@id":"https:\/\/kalilinuxtutorials.com\/using-bulk-scripting-with-remote-it\/"},"author":{"name":"Balaji N","@id":"https:\/\/kalilinuxtutorials.com\/#\/schema\/person\/60a7ca200659320919e000590b4f7c3a"},"headline":"Using Bulk Scripting With remote.it","datePublished":"2020-09-28T16:50:41+00:00","mainEntityOfPage":{"@id":"https:\/\/kalilinuxtutorials.com\/using-bulk-scripting-with-remote-it\/"},"wordCount":2293,"publisher":{"@id":"https:\/\/kalilinuxtutorials.com\/#organization"},"image":{"@id":"https:\/\/kalilinuxtutorials.com\/using-bulk-scripting-with-remote-it\/#primaryimage"},"thumbnailUrl":"https:\/\/1.bp.blogspot.com\/-a4Au9_k1Rj0\/X3S4BcAloKI\/AAAAAAAAKnc\/r0YsTTgazkEhI5pQbKiWaU_GxSLl2kQHQCLcBGAsYHQ\/s16000\/Scripting.png","articleSection":["Blog"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/kalilinuxtutorials.com\/using-bulk-scripting-with-remote-it\/","url":"https:\/\/kalilinuxtutorials.com\/using-bulk-scripting-with-remote-it\/","name":"Using Bulk Scripting With remote.it - Kali Linux Tutorials","isPartOf":{"@id":"https:\/\/kalilinuxtutorials.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kalilinuxtutorials.com\/using-bulk-scripting-with-remote-it\/#primaryimage"},"image":{"@id":"https:\/\/kalilinuxtutorials.com\/using-bulk-scripting-with-remote-it\/#primaryimage"},"thumbnailUrl":"https:\/\/1.bp.blogspot.com\/-a4Au9_k1Rj0\/X3S4BcAloKI\/AAAAAAAAKnc\/r0YsTTgazkEhI5pQbKiWaU_GxSLl2kQHQCLcBGAsYHQ\/s16000\/Scripting.png","datePublished":"2020-09-28T16:50:41+00:00","inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kalilinuxtutorials.com\/using-bulk-scripting-with-remote-it\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/kalilinuxtutorials.com\/using-bulk-scripting-with-remote-it\/#primaryimage","url":"https:\/\/1.bp.blogspot.com\/-a4Au9_k1Rj0\/X3S4BcAloKI\/AAAAAAAAKnc\/r0YsTTgazkEhI5pQbKiWaU_GxSLl2kQHQCLcBGAsYHQ\/s16000\/Scripting.png","contentUrl":"https:\/\/1.bp.blogspot.com\/-a4Au9_k1Rj0\/X3S4BcAloKI\/AAAAAAAAKnc\/r0YsTTgazkEhI5pQbKiWaU_GxSLl2kQHQCLcBGAsYHQ\/s16000\/Scripting.png"},{"@type":"WebSite","@id":"https:\/\/kalilinuxtutorials.com\/#website","url":"https:\/\/kalilinuxtutorials.com\/","name":"Kali Linux Tutorials","description":"Kali Linux Tutorials","publisher":{"@id":"https:\/\/kalilinuxtutorials.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kalilinuxtutorials.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/kalilinuxtutorials.com\/#organization","name":"Kali Linux Tutorials","url":"https:\/\/kalilinuxtutorials.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/kalilinuxtutorials.com\/#\/schema\/logo\/image\/","url":"https:\/\/kalilinuxtutorials.com\/wp-content\/uploads\/2025\/07\/Kali.png","contentUrl":"https:\/\/kalilinuxtutorials.com\/wp-content\/uploads\/2025\/07\/Kali.png","width":272,"height":90,"caption":"Kali Linux Tutorials"},"image":{"@id":"https:\/\/kalilinuxtutorials.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/CyberEdition","https:\/\/www.threads.com\/@cybersecurityedition","https:\/\/www.linkedin.com\/company\/cyberedition","https:\/\/www.instagram.com\/cybersecurityedition\/"]},{"@type":"Person","@id":"https:\/\/kalilinuxtutorials.com\/#\/schema\/person\/60a7ca200659320919e000590b4f7c3a","name":"Balaji N","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/kalilinuxtutorials.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/731b188cc4b41a930b86edb5b329269c4eb591acf245f8e5fc318f42b517ff2a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/731b188cc4b41a930b86edb5b329269c4eb591acf245f8e5fc318f42b517ff2a?s=96&d=mm&r=g","caption":"Balaji N"},"description":"Balaji is an Editor-in-Chief &amp; Co-Founder - Cyber Security News, GBHackers On Security &amp; Kali Linux Tutorials.","url":"https:\/\/kalilinuxtutorials.com\/author\/balaji\/"}]}},"jetpack_featured_media_url":"https:\/\/1.bp.blogspot.com\/-a4Au9_k1Rj0\/X3S4BcAloKI\/AAAAAAAAKnc\/r0YsTTgazkEhI5pQbKiWaU_GxSLl2kQHQCLcBGAsYHQ\/s16000\/Scripting.png","jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":29552,"url":"https:\/\/kalilinuxtutorials.com\/dedicated-devices-and-how-your-organization-can-benefit-from-them\/","url_meta":{"origin":11575,"position":0},"title":"Dedicated Devices and How your Organization Can Benefit From Them","author":"p r","date":"July 26, 2023","format":false,"excerpt":"Mobile devices for work have become prevalent in organizations of all sizes. Firms in finance, retail, healthcare, education, and other sectors use easy-to-carry smartphones and tablets because these devices enable mobile workforces, increase productivity, and simplify repetitive tasks. However, when mobile devices are used in enterprises, IT admins face a\u2026","rel":"","context":"In &quot;TECH&quot;","block_context":{"text":"TECH","link":"https:\/\/kalilinuxtutorials.com\/category\/tech\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgNJeClI_kBeqc2Wr_Vdn2vbPxKYXV8ejdiUZ0FMaq_E2245uhKb1Kc1gZFSFUknhOq6pr-NjVnZvJ3ilXFaRmqXBVFNmgxWsNZYsjmAS7y7QhgleZqJVrlbXJUw9WISzEVKvZ6t2DDTXhRoSOjDdhiJ9NF-4CQsYqBiRAsy8LY3XZFw0X3NuwLmc50rD0P\/s16000\/Capture.PNG?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgNJeClI_kBeqc2Wr_Vdn2vbPxKYXV8ejdiUZ0FMaq_E2245uhKb1Kc1gZFSFUknhOq6pr-NjVnZvJ3ilXFaRmqXBVFNmgxWsNZYsjmAS7y7QhgleZqJVrlbXJUw9WISzEVKvZ6t2DDTXhRoSOjDdhiJ9NF-4CQsYqBiRAsy8LY3XZFw0X3NuwLmc50rD0P\/s16000\/Capture.PNG?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgNJeClI_kBeqc2Wr_Vdn2vbPxKYXV8ejdiUZ0FMaq_E2245uhKb1Kc1gZFSFUknhOq6pr-NjVnZvJ3ilXFaRmqXBVFNmgxWsNZYsjmAS7y7QhgleZqJVrlbXJUw9WISzEVKvZ6t2DDTXhRoSOjDdhiJ9NF-4CQsYqBiRAsy8LY3XZFw0X3NuwLmc50rD0P\/s16000\/Capture.PNG?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgNJeClI_kBeqc2Wr_Vdn2vbPxKYXV8ejdiUZ0FMaq_E2245uhKb1Kc1gZFSFUknhOq6pr-NjVnZvJ3ilXFaRmqXBVFNmgxWsNZYsjmAS7y7QhgleZqJVrlbXJUw9WISzEVKvZ6t2DDTXhRoSOjDdhiJ9NF-4CQsYqBiRAsy8LY3XZFw0X3NuwLmc50rD0P\/s16000\/Capture.PNG?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":3938,"url":"https:\/\/kalilinuxtutorials.com\/trommel-embedded-vulnerable-indicators\/","url_meta":{"origin":11575,"position":1},"title":"Trommel : Sift Through Embedded Device Files to Identify Potential Vulnerable Indicators","author":"R K","date":"February 21, 2019","format":false,"excerpt":"TROMMEL sifts through embedded device files to identify potential vulnerable indicators.\u00a0It identifies the following indicators related to: Secure Shell (SSH) key filesSecure Socket Layer (SSL) key filesInternet Protocol (IP) addressesUniform Resource Locator (URL)email addressesshell scriptsweb server binariesconfiguration filesdatabase filesspecific binaries files (i.e. Dropbear, BusyBox, etc.)shared object library filesweb application scripting\u2026","rel":"","context":"In &quot;Kali Linux&quot;","block_context":{"text":"Kali Linux","link":"https:\/\/kalilinuxtutorials.com\/category\/kali\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":29721,"url":"https:\/\/kalilinuxtutorials.com\/empowering-frontline-workers\/","url_meta":{"origin":11575,"position":2},"title":"Empowering Frontline Workers: Streamline Device Management For An Enhanced Employee Experience","author":"Gayathri vijayakumar","date":"August 31, 2023","format":false,"excerpt":"In today's fast-paced world, frontline workers play a vital role in delivering services and products directly to customers. From healthcare providers and retail associates to logistics personnel and customer service representatives, these frontline workers rely on mobile devices to streamline their tasks. To elevate and unleash their full potential, organizations\u2026","rel":"","context":"In &quot;Cyber security&quot;","block_context":{"text":"Cyber security","link":"https:\/\/kalilinuxtutorials.com\/category\/cyber-security\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEhG5S5zo9vI2pUUILOCXjp8QfSuU3dH2TriHpmSGS7JhISLk-T3LukHEYI9FvaVVbX6LObGTevDEmxzrvpSO6mwG4lxALXpLITNB2tGPwr7l4nSqKOwCIPclAyXPiOEr3SUNjrQrYk5qUxah-27MhnJpWo7IdTrKrqPPUXGyGu9FntPuGWd-S-3dySUYg\/s16000\/Empowering%20Frontline%20Workers%20.webp?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEhG5S5zo9vI2pUUILOCXjp8QfSuU3dH2TriHpmSGS7JhISLk-T3LukHEYI9FvaVVbX6LObGTevDEmxzrvpSO6mwG4lxALXpLITNB2tGPwr7l4nSqKOwCIPclAyXPiOEr3SUNjrQrYk5qUxah-27MhnJpWo7IdTrKrqPPUXGyGu9FntPuGWd-S-3dySUYg\/s16000\/Empowering%20Frontline%20Workers%20.webp?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEhG5S5zo9vI2pUUILOCXjp8QfSuU3dH2TriHpmSGS7JhISLk-T3LukHEYI9FvaVVbX6LObGTevDEmxzrvpSO6mwG4lxALXpLITNB2tGPwr7l4nSqKOwCIPclAyXPiOEr3SUNjrQrYk5qUxah-27MhnJpWo7IdTrKrqPPUXGyGu9FntPuGWd-S-3dySUYg\/s16000\/Empowering%20Frontline%20Workers%20.webp?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEhG5S5zo9vI2pUUILOCXjp8QfSuU3dH2TriHpmSGS7JhISLk-T3LukHEYI9FvaVVbX6LObGTevDEmxzrvpSO6mwG4lxALXpLITNB2tGPwr7l4nSqKOwCIPclAyXPiOEr3SUNjrQrYk5qUxah-27MhnJpWo7IdTrKrqPPUXGyGu9FntPuGWd-S-3dySUYg\/s16000\/Empowering%20Frontline%20Workers%20.webp?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEhG5S5zo9vI2pUUILOCXjp8QfSuU3dH2TriHpmSGS7JhISLk-T3LukHEYI9FvaVVbX6LObGTevDEmxzrvpSO6mwG4lxALXpLITNB2tGPwr7l4nSqKOwCIPclAyXPiOEr3SUNjrQrYk5qUxah-27MhnJpWo7IdTrKrqPPUXGyGu9FntPuGWd-S-3dySUYg\/s16000\/Empowering%20Frontline%20Workers%20.webp?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEhG5S5zo9vI2pUUILOCXjp8QfSuU3dH2TriHpmSGS7JhISLk-T3LukHEYI9FvaVVbX6LObGTevDEmxzrvpSO6mwG4lxALXpLITNB2tGPwr7l4nSqKOwCIPclAyXPiOEr3SUNjrQrYk5qUxah-27MhnJpWo7IdTrKrqPPUXGyGu9FntPuGWd-S-3dySUYg\/s16000\/Empowering%20Frontline%20Workers%20.webp?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":37375,"url":"https:\/\/kalilinuxtutorials.com\/endpoint-with-missing-agents\/","url_meta":{"origin":11575,"position":3},"title":"Endpoint With Missing Agents : Identifying And Managing Security Gaps","author":"Varshini","date":"March 28, 2025","format":false,"excerpt":"Endpoint security is crucial for protecting organizations from cyber threats. However, managing endpoint agents can be challenging, especially when devices are missing critical security software. This article explores how to identify and manage endpoints with missing agents using tools like Microsoft Defender for Endpoint and Intune. Challenges With Endpoint Agents\u2026","rel":"","context":"In &quot;Cyber security&quot;","block_context":{"text":"Cyber security","link":"https:\/\/kalilinuxtutorials.com\/category\/cyber-security\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/kalilinuxtutorials.com\/wp-content\/uploads\/2025\/03\/Endpoint-With-Missing-Agents.webp?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/kalilinuxtutorials.com\/wp-content\/uploads\/2025\/03\/Endpoint-With-Missing-Agents.webp?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/kalilinuxtutorials.com\/wp-content\/uploads\/2025\/03\/Endpoint-With-Missing-Agents.webp?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/kalilinuxtutorials.com\/wp-content\/uploads\/2025\/03\/Endpoint-With-Missing-Agents.webp?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/kalilinuxtutorials.com\/wp-content\/uploads\/2025\/03\/Endpoint-With-Missing-Agents.webp?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/kalilinuxtutorials.com\/wp-content\/uploads\/2025\/03\/Endpoint-With-Missing-Agents.webp?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":36437,"url":"https:\/\/kalilinuxtutorials.com\/rustdesk-server\/","url_meta":{"origin":11575,"position":4},"title":"RustDesk Server : A Comprehensive Guide To Building Your Own Secure Remote Desktop Environment","author":"Varshini","date":"February 14, 2025","format":false,"excerpt":"RustDesk is a free, open-source remote desktop solution that allows users to connect to and control remote devices securely. To enhance its functionality and provide self-hosting capabilities, RustDesk offers a server component called RustDesk Server. This article explores the tools and functions of the RustDesk Server, including its components, deployment\u2026","rel":"","context":"In &quot;Cyber security&quot;","block_context":{"text":"Cyber security","link":"https:\/\/kalilinuxtutorials.com\/category\/cyber-security\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/kalilinuxtutorials.com\/wp-content\/uploads\/2025\/02\/RustDesk-Server.webp?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/kalilinuxtutorials.com\/wp-content\/uploads\/2025\/02\/RustDesk-Server.webp?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/kalilinuxtutorials.com\/wp-content\/uploads\/2025\/02\/RustDesk-Server.webp?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/kalilinuxtutorials.com\/wp-content\/uploads\/2025\/02\/RustDesk-Server.webp?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/kalilinuxtutorials.com\/wp-content\/uploads\/2025\/02\/RustDesk-Server.webp?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/kalilinuxtutorials.com\/wp-content\/uploads\/2025\/02\/RustDesk-Server.webp?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":34723,"url":"https:\/\/kalilinuxtutorials.com\/adbnet\/","url_meta":{"origin":11575,"position":5},"title":"AdbNet &#8211; Mastering Android Device Exploitation","author":"Varshini","date":"September 3, 2024","format":false,"excerpt":"A sophisticated tool designed for exploiting vulnerabilities in Android devices. This article dives into the features of AdbNet, offering a detailed guide on how to identify and connect to susceptible Android devices globally. Learn how to leverage its post-exploitation modules to gain comprehensive control and execute advanced operations on compromised\u2026","rel":"","context":"In &quot;Android Security&quot;","block_context":{"text":"Android Security","link":"https:\/\/kalilinuxtutorials.com\/category\/android-security\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgFeoz5x9KJIhM211gpnvi39d_ESrsieqysEO6y8OOreoLHDaIgoaq3c37WRHCLdiQJc6QB644Crk7bbtbbGKBDwtLf34Jx78bP3kaPgUVaKkNJFtMOvoncttA2qGTBxwoYqLcWms9NKAnptiZWVAsvR4a-nRxRiD9ZbwILZw0Am1PMwbB_EOPaN19Ds960\/s16000\/AdbNet.webp?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgFeoz5x9KJIhM211gpnvi39d_ESrsieqysEO6y8OOreoLHDaIgoaq3c37WRHCLdiQJc6QB644Crk7bbtbbGKBDwtLf34Jx78bP3kaPgUVaKkNJFtMOvoncttA2qGTBxwoYqLcWms9NKAnptiZWVAsvR4a-nRxRiD9ZbwILZw0Am1PMwbB_EOPaN19Ds960\/s16000\/AdbNet.webp?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgFeoz5x9KJIhM211gpnvi39d_ESrsieqysEO6y8OOreoLHDaIgoaq3c37WRHCLdiQJc6QB644Crk7bbtbbGKBDwtLf34Jx78bP3kaPgUVaKkNJFtMOvoncttA2qGTBxwoYqLcWms9NKAnptiZWVAsvR4a-nRxRiD9ZbwILZw0Am1PMwbB_EOPaN19Ds960\/s16000\/AdbNet.webp?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgFeoz5x9KJIhM211gpnvi39d_ESrsieqysEO6y8OOreoLHDaIgoaq3c37WRHCLdiQJc6QB644Crk7bbtbbGKBDwtLf34Jx78bP3kaPgUVaKkNJFtMOvoncttA2qGTBxwoYqLcWms9NKAnptiZWVAsvR4a-nRxRiD9ZbwILZw0Am1PMwbB_EOPaN19Ds960\/s16000\/AdbNet.webp?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgFeoz5x9KJIhM211gpnvi39d_ESrsieqysEO6y8OOreoLHDaIgoaq3c37WRHCLdiQJc6QB644Crk7bbtbbGKBDwtLf34Jx78bP3kaPgUVaKkNJFtMOvoncttA2qGTBxwoYqLcWms9NKAnptiZWVAsvR4a-nRxRiD9ZbwILZw0Am1PMwbB_EOPaN19Ds960\/s16000\/AdbNet.webp?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgFeoz5x9KJIhM211gpnvi39d_ESrsieqysEO6y8OOreoLHDaIgoaq3c37WRHCLdiQJc6QB644Crk7bbtbbGKBDwtLf34Jx78bP3kaPgUVaKkNJFtMOvoncttA2qGTBxwoYqLcWms9NKAnptiZWVAsvR4a-nRxRiD9ZbwILZw0Am1PMwbB_EOPaN19Ds960\/s16000\/AdbNet.webp?resize=1400%2C800&ssl=1 4x"},"classes":[]}],"_links":{"self":[{"href":"https:\/\/kalilinuxtutorials.com\/wp-json\/wp\/v2\/posts\/11575","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kalilinuxtutorials.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kalilinuxtutorials.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kalilinuxtutorials.com\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/kalilinuxtutorials.com\/wp-json\/wp\/v2\/comments?post=11575"}],"version-history":[{"count":0,"href":"https:\/\/kalilinuxtutorials.com\/wp-json\/wp\/v2\/posts\/11575\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kalilinuxtutorials.com\/wp-json\/wp\/v2\/media\/16533"}],"wp:attachment":[{"href":"https:\/\/kalilinuxtutorials.com\/wp-json\/wp\/v2\/media?parent=11575"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kalilinuxtutorials.com\/wp-json\/wp\/v2\/categories?post=11575"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kalilinuxtutorials.com\/wp-json\/wp\/v2\/tags?post=11575"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}