{"id":513829,"date":"2025-08-25T12:05:14","date_gmt":"2025-08-25T12:05:14","guid":{"rendered":"https:\/\/www.ninjaone.com\/?post_type=script_hub&#038;p=513829"},"modified":"2025-08-25T12:05:14","modified_gmt":"2025-08-25T12:05:14","slug":"obtenir-les-details-de-la-connexion-iscsi-sur-linux-avec-un-script-shell","status":"publish","type":"script_hub","link":"https:\/\/www.ninjaone.com\/fr\/script-hub\/obtenir-les-details-de-la-connexion-iscsi-sur-linux-avec-un-script-shell\/","title":{"rendered":"Comment obtenir les d\u00e9tails de la connexion iSCSI sur Linux avec un script Shell"},"content":{"rendered":"<p>Les environnements informatiques modernes s&rsquo;appuient fortement sur des solutions de stockage \u00e9volutives et performantes. L&rsquo;une de ces technologies est\u00a0<strong>iSCSI (Internet Small Computer System Interface)<\/strong>, qui permet de transmettre des donn\u00e9es de stockage au niveau des blocs sur des r\u00e9seaux IP. La gestion et la surveillance des connexions iSCSI sont essentielles pour les administrateurs syst\u00e8me, en particulier dans les infrastructures complexes g\u00e9r\u00e9es par les entreprises ou les MSP. Cet article de blog pr\u00e9sente un script shell qui permet aux administrateurs Linux\u00a0<strong>d&rsquo;obtenir les d\u00e9tails de la connexion iSCSI sur Linux \u00e0 l&rsquo;aide d&rsquo;un script shell<\/strong>; id\u00e9al pour les diagnostics, les rapports et l&rsquo;int\u00e9gration avec des plateformes <a href=\"https:\/\/www.ninjaone.com\/fr\/blog\/definition-de-la-surveillance-et-gestion-a-distance\/\">RMM<\/a> comme NinjaOne.<\/p>\n<h2>Contexte<\/h2>\n<p>Pour les professionnels de l&rsquo;informatique, la visibilit\u00e9 de la structure de stockage sous-jacente est cruciale. Les configurations iSCSI, souvent invisibles pour les applications de niveau sup\u00e9rieur, sont fondamentales dans les clusters de virtualisation, les environnements \u00e0 haute disponibilit\u00e9 et les centres de donn\u00e9es. Pourtant, <a href=\"https:\/\/www.ninjaone.com\/fr\/blog\/guide-complet-panorama-des-systemes-de-fichiers-linux\/\">Linux<\/a> ne fournit que des outils en ligne de commande comme iscsiadm pour interroger ces informations, et ils renvoient g\u00e9n\u00e9ralement des donn\u00e9es non structur\u00e9es. Cela peut entraver l&rsquo;automatisation et la cr\u00e9ation de rapports en temps r\u00e9el, \u00e9l\u00e9ments cl\u00e9s des op\u00e9rations informatiques modernes.<\/p>\n<p>Ce script shell comble cette lacune. Non seulement il recueille des informations d\u00e9taill\u00e9es sur la session et la connexion, mais il formate \u00e9galement le r\u00e9sultat dans des tableaux HTML et le pousse \u00e9ventuellement dans un champ personnalis\u00e9 NinjaOne WYSIWYG. Cela permet une visibilit\u00e9 transparente dans les tableaux de bord RMM, aucune analyse manuelle ou recherche de journaux n&rsquo;est n\u00e9cessaire.<\/p>\n<h2>Le script<\/h2>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">#!\/usr\/bin\/env bash\r\n\r\n# Description: Gets the details of all iSCSI devices on the system.\r\n# By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https:\/\/www.ninjaone.com\/terms-of-use.\r\n# Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. \r\n# Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. \r\n# Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. \r\n# Warranty Disclaimer: The script is provided \u201cas is\u201d and \u201cas available\u201d, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. \r\n# Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. \r\n# Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. \r\n# EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA).\r\n#\r\n# Release Notes: Initial Release\r\n#\r\n# Usage: [-WYSIWYGCustomFieldName &lt;Arg&gt;]\r\n#\r\n# Preset Parameter: --help\r\n#   Displays the help menu.\r\n#\r\n# Preset Parameter: --WYSIWYGCustomFieldName \"ReplaceMeWithAnyMultilineCustomField\"\r\n#   Optionally specify the name of a WYSIWYG custom field to save the results to.\r\n\r\n# Functions\r\n# Print an error message and exit with a specific status code\r\ndie() {\r\n    local _ret=\"${2:-1}\"\r\n    test \"${_PRINT_HELP:-no}\" = yes &amp;&amp; print_help &gt;&amp;2\r\n    echo \"$1\" &gt;&amp;2\r\n    exit \"${_ret}\"\r\n}\r\n\r\nprint_help() {\r\n    printf '\\n\\n%s\\n\\n' 'Usage: [-WYSIWYGCustomFieldName &lt;Arg&gt;]'\r\n    printf '%s\\n' 'Preset Parameter: --help'\r\n    printf '\\t%s\\n' \"Displays the help menu.\"\r\n    printf '%s\\n' 'Preset Parameter: --WYSIWYGCustomFieldName \"ReplaceMeWithAnyMultilineCustomField\"'\r\n    printf '\\t%s\\n' \"Optionally specify the name of a WYSIWYG custom field to save the results to.\"\r\n}\r\n\r\nconvertToHTMLTable() {\r\n    local _arg_delimiter=\" \"\r\n    local _arg_inputObject\r\n\r\n    # Process command-line arguments for the function.\r\n    while test $# -gt 0; do\r\n        _key=\"$1\"\r\n        case \"$_key\" in\r\n        --delimiter | -d)\r\n            test $# -lt 2 &amp;&amp; echo \"[Error] Missing value for the required argument\" &gt;&amp;2 &amp;&amp; return 1\r\n            _arg_delimiter=$2\r\n            shift\r\n            ;;\r\n        --*)\r\n            echo \"[Error] Got an unexpected argument\" &gt;&amp;2\r\n            return 1\r\n            ;;\r\n        *)\r\n            _arg_inputObject=$1\r\n            ;;\r\n        esac\r\n        shift\r\n    done\r\n\r\n    # Handles missing input by checking stdin or returning an error.\r\n    if [[ -z $_arg_inputObject ]]; then\r\n        if [ -p \/dev\/stdin ]; then\r\n            _arg_inputObject=$(cat)\r\n        else\r\n            echo \"[Error] Missing input object to convert to table\" &gt;&amp;2\r\n            return 1\r\n        fi\r\n    fi\r\n\r\n    local htmlTable=\"&lt;table&gt;\\n\"\r\n    htmlTable+=$(printf '%b' \"$_arg_inputObject\" | head -n1 | awk -F \"$_arg_delimiter\" '{\r\n        printf \"&lt;tr&gt;\"\r\n        for (i=1; i&lt;=NF; i+=1)\r\n        { printf \"&lt;th&gt;\"$i\"&lt;\/th&gt;\" }\r\n        printf \"&lt;\/tr&gt;\"\r\n    }')\r\n    htmlTable+=\"\\n\"\r\n    htmlTable+=$(printf '%b' \"$_arg_inputObject\" | tail -n +2 | awk -F \"$_arg_delimiter\" '{\r\n        printf \"&lt;tr&gt;\"\r\n        for (i=1; i&lt;=NF; i+=1)\r\n        { printf \"&lt;td&gt;\"$i\"&lt;\/td&gt;\" }\r\n        print \"&lt;\/tr&gt;\"\r\n    }')\r\n    htmlTable+=\"\\n&lt;\/table&gt;\"\r\n\r\n    printf '%b' \"$htmlTable\" '\\n'\r\n}\r\n\r\n# Function to set a custom field\r\nfunction SetCustomField() {\r\n    if [[ -z \"$1\" ]] || [[ -z \"$2\" ]]; then\r\n        echo \"[Error] Missing required arguments.\"\r\n        return 1\r\n    fi\r\n    local customfieldName=$1\r\n    local customfieldValue=$2\r\n    if [ -f \"${NINJA_DATA_PATH}\/ninjarmm-cli\" ]; then\r\n        if [ -x \"${NINJA_DATA_PATH}\/ninjarmm-cli\" ]; then\r\n            if \"$NINJA_DATA_PATH\"\/ninjarmm-cli get \"$customfieldName\" &gt;\/dev\/null; then\r\n                # check if the value is greater than 10000 characters\r\n                if [ ${#customfieldValue} -gt 10000 ]; then\r\n                    echo \"[Warn] Custom field value is greater than 10000 characters\"\r\n                fi\r\n                if ! echo \"${customfieldValue::10000}\" | \"$NINJA_DATA_PATH\"\/ninjarmm-cli set --stdin \"$customfieldName\"; then\r\n                    echo \"[Warn] Failed to set custom field\"\r\n                else\r\n                    echo \"[Info] Custom field value set successfully\"\r\n                fi\r\n            else\r\n                echo \"[Warn] Custom Field ($customfieldName) does not exist or agent does not have permission to access it\"\r\n            fi\r\n        else\r\n            echo \"[Warn] ninjarmm-cli is not executable\"\r\n        fi\r\n    else\r\n        echo \"[Warn] ninjarmm-cli does not exist\"\r\n    fi\r\n}\r\n\r\n# Parse the command-line arguments\r\nparse_commandline() {\r\n    while test $# -gt 0; do\r\n        _key=\"$1\"\r\n        case \"$_key\" in\r\n        -w | --WYSIWYGCustomFieldName)\r\n            test $# -lt 2 &amp;&amp; die \"Missing value for the optional argument '$_key'.\" 1\r\n            _arg_WYSIWYGCustomFieldName=\"$2\"\r\n            shift\r\n            ;;\r\n        --WYSIWYGCustomFieldName=*)\r\n            _arg_WYSIWYGCustomFieldName=\"${_key##--wysiwygCustomFieldName=}\"\r\n            ;;\r\n        -w*)\r\n            _arg_WYSIWYGCustomFieldName=\"${_key##-w}\"\r\n            ;;\r\n        --help)\r\n            _PRINT_HELP=yes die \"\" 0\r\n            ;;\r\n        -h)\r\n            _PRINT_HELP=yes die \"\" 0\r\n            ;;\r\n        *)\r\n            _PRINT_HELP=yes die \"[Error] Got an unexpected argument '$1'\" 1\r\n            ;;\r\n        esac\r\n        shift\r\n    done\r\n}\r\n\r\nparse_commandline \"$@\"\r\n\r\n# If script form variables are used, replace the command line parameters with their value.\r\nif [[ -n \"${wysiwygCustomFieldName}\" ]]; then\r\n    _arg_WYSIWYGCustomFieldName=\"$wysiwygCustomFieldName\"\r\nfi\r\n\r\n# If no valid custom field was provided, display an error message and exit the script.\r\n# if [[ -z \"${_arg_WYSIWYGCustomFieldName}\" ]]; then\r\n#     _PRINT_HELP=yes die \"[Error] You must provide a valid WYSIWYG custom field name.\" 1\r\n# fi\r\n\r\n# Check if the root user is running the script\r\nif [[ $EUID -ne 0 ]]; then\r\n    die \"[Error] This script must be run as root.\" 1\r\nfi\r\n\r\nif ! [ \"$(command -v iscsiadm)\" ]; then\r\n    die \"[Error] The command iscsiadm not installed.\" 1\r\nfi\r\n\r\nif ! [ -f \"\/etc\/iscsi\/iscsid.conf\" ]; then\r\n    die \"[Error] \/etc\/iscsi\/iscsid.conf is not present.\" 1\r\nfi\r\n\r\n# Print Initiator Name\r\n_connection_identifier=$(grep -v \"#\" \/etc\/iscsi\/initiatorname.iscsi 2&gt;\/dev\/null | awk -F= '{print $2}')\r\n\r\n# Get the iSCSI session details\r\nsession=$(iscsiadm -m session -P 3 2&gt;&amp;1)\r\n\r\n# HTML title variables\r\n_title_connections=\"iSCSI Connections\"\r\n_title_sessions=\"iSCSI Sessions\"\r\n\r\n# Delimiter for result parsing\r\n_delimiter=\";\"\r\n\r\n# iSCSI Connections\r\ndeclare -g _iscsi_connections=\"\"\r\ndeclare -g _initiator_address=\"\"\r\ndeclare -g _initiator_port=\"\"\r\ndeclare -g _target_address=\"\"\r\ndeclare -g _target_port=\"\"\r\n\r\n# iSCSI Sessions\r\ndeclare -g _iscsi_sessions=\"\"\r\ndeclare -g _authentication_type=\"\"\r\ndeclare -g _initiator_name=\"\"\r\ndeclare -g _initiator_node_address=\"\"\r\ndeclare -g _initiator_node_portal_address=\"\"\r\ndeclare -g _initiator_side_identifier=\"\"\r\ndeclare -g _is_connected=\"\"\r\ndeclare -g _is_data_digest=\"\"\r\ndeclare -g _is_persistent=\"\"\r\ndeclare -g _number_of_luns=0\r\ndeclare -g _session_identifier=\"\"\r\ndeclare -g _target_node_address=\"\"\r\ndeclare -g _target_side_identifier=\"\"\r\n\r\nwhile read -r line; do\r\n    if [[ \"$line\" == \"Target:\"* ]]; then\r\n        if [[ -n \"${_initiator_address}\" ]]; then\r\n            # Add results\r\n            _iscsi_connections=\"${_iscsi_connections}\\n\"\r\n            _iscsi_connections=\"${_iscsi_connections}${_connection_identifier}${_delimiter}\"\r\n            _iscsi_connections=\"${_iscsi_connections}${_initiator_address}${_delimiter}\"\r\n            _iscsi_connections=\"${_iscsi_connections}${_initiator_port}${_delimiter}\"\r\n            _iscsi_connections=\"${_iscsi_connections}${_target_address}${_delimiter}\"\r\n            _iscsi_connections=\"${_iscsi_connections}${_target_port}\"\r\n            _iscsi_sessions=\"${_iscsi_sessions}\\n\"\r\n            _iscsi_sessions=\"${_iscsi_sessions}${_authentication_type}${_delimiter}\"\r\n            _iscsi_sessions=\"${_iscsi_sessions}${_initiator_name}${_delimiter}\"\r\n            _iscsi_sessions=\"${_iscsi_sessions}${_initiator_node_address}${_delimiter}\"\r\n            _iscsi_sessions=\"${_iscsi_sessions}${_initiator_node_portal_address}${_delimiter}\"\r\n            _iscsi_sessions=\"${_iscsi_sessions}${_initiator_side_identifier}${_delimiter}\"\r\n            _iscsi_sessions=\"${_iscsi_sessions}${_is_connected}${_delimiter}\"\r\n            _iscsi_sessions=\"${_iscsi_sessions}${_is_data_digest}${_delimiter}\"\r\n            _iscsi_sessions=\"${_iscsi_sessions}${_is_persistent}${_delimiter}\"\r\n            _iscsi_sessions=\"${_iscsi_sessions}${_number_of_luns}${_delimiter}\"\r\n            _iscsi_sessions=\"${_iscsi_sessions}${_session_identifier}${_delimiter}\"\r\n            _iscsi_sessions=\"${_iscsi_sessions}${_target_node_address}${_delimiter}\"\r\n            _iscsi_sessions=\"${_iscsi_sessions}${_target_side_identifier}\"\r\n        fi\r\n\r\n        # Reset the variables\r\n        # iSCSI Connections\r\n        _initiator_address=\"\"\r\n        _initiator_port=\"\"\r\n        _target_address=\"\"\r\n        _target_port=\"\"\r\n\r\n        # iSCSI Sessions\r\n        _authentication_type=\"\"\r\n        _initiator_name=\"\"\r\n        _initiator_node_address=\"\"\r\n        _initiator_node_portal_address=\"\"\r\n        _initiator_side_identifier=\"\"\r\n        _is_connected=\"\"\r\n        _is_data_digest=\"\"\r\n        _is_persistent=\"\"\r\n        _number_of_luns=0\r\n        _session_identifier=\"\"\r\n        _target_node_address=\"\"\r\n        _target_side_identifier=\"\"\r\n\r\n        # Get the target\r\n        connection_identifier=$(echo \"$line\" | cut -d ':' -f 2-3 | awk '{print $1}')\r\n        _target_node_address=$(echo \"$connection_identifier\" | cut -d ':' -f 1-2 | awk '{$1=$1;print}')\r\n        _target_address=$(echo \"$connection_identifier\" | cut -d ':' -f 1 | awk '{$1=$1;print}')\r\n        _target_side_identifier=$(echo \"$connection_identifier\" | cut -d ':' -f 2 | awk '{print $1}')\r\n    fi\r\n    if [[ \"$line\" == *\"Current Portal:\"* ]]; then\r\n        portal=$(echo \"$line\" | cut -d ':' -f 2-3)\r\n        _initiator_node_portal_address=$(echo \"$portal\" | cut -d ':' -f 1-2 | cut -d ',' -f 1 | awk '{$1=$1;print}')\r\n        _initiator_port=$(echo \"$portal\" | cut -d ':' -f 2 | cut -d ',' -f 1 | awk '{$1=$1;print}')\r\n        _target_port=$(echo \"$portal\" | cut -d ':' -f 2 | cut -d ',' -f 1 | awk '{$1=$1;print}')\r\n    fi\r\n    if [[ \"$line\" == *\"Persistent Portal:\"* ]]; then\r\n        _is_persistent=\"Yes\"\r\n    fi\r\n    if [[ \"$line\" == *\"Iface Name:\"* ]]; then\r\n        _initiator_name=$(echo \"$line\" | cut -d ':' -f 2 | awk '{$1=$1;print}')\r\n    fi\r\n    if [[ \"$line\" == *\"Iface Initiatorname:\"* ]]; then\r\n        initiator=$(echo \"$line\" | cut -d ':' -f 2-4)\r\n        _initiator_node_address=$(echo \"$initiator\" | cut -d ':' -f 1-2 | awk '{$1=$1;print}')\r\n        _initiator_side_identifier=$(echo \"$initiator\" | cut -d ':' -f 3 | awk '{$1=$1;print}')\r\n        _initiator_address=$(echo \"$initiator\" | cut -d ':' -f 1 | awk '{$1=$1;print}')\r\n    fi\r\n    if [[ \"$line\" == *\"iSCSI Connection State:\"* ]]; then\r\n        _is_connected=$(echo \"$line\" | cut -d ':' -f 2 | awk '{$1=$1;print}')\r\n    fi\r\n    if [[ \"$line\" == *\"SID:\"* ]]; then\r\n        _session_identifier=$(echo \"$line\" | cut -d ':' -f 2 | awk '{$1=$1;print}')\r\n    fi\r\n    if [[ \"$line\" == *\"DataDigest:\"* ]]; then\r\n        _is_data_digest=$(echo \"$line\" | cut -d ':' -f 2 | awk '{$1=$1;print}')\r\n    fi\r\n    if [[ \"$line\" == *\"CHAP:\"* ]]; then\r\n        _authentication_type=\"CHAP\"\r\n    fi\r\n    if [[ \"$line\" == *\"username: &lt;empty&gt;\"* ]]; then\r\n        # If the username is empty, set auth_method to None\r\n        _authentication_type=\"None\"\r\n    fi\r\n    if [[ \"$line\" == *\"Lun:\"* ]]; then\r\n        _number_of_luns=$((_number_of_luns + 1))\r\n    fi\r\n\r\ndone &lt;&lt;&lt;\"$session\"\r\n\r\n_iscsi_connections=\"${_iscsi_connections}\\n${_connection_identifier}${_delimiter}${_initiator_address}${_delimiter}${_initiator_port}${_delimiter}${_target_address}${_delimiter}${_target_port}\"\r\n_iscsi_sessions=\"${_iscsi_sessions}\\n${_authentication_type}${_delimiter}${_initiator_name}${_delimiter}${_initiator_node_address}${_delimiter}${_initiator_node_portal_address}${_delimiter}${_initiator_side_identifier}${_delimiter}${_is_connected}${_delimiter}${_is_data_digest}${_delimiter}${_is_persistent}${_delimiter}${_number_of_luns}${_delimiter}${_session_identifier}${_delimiter}${_target_node_address}${_delimiter}${_target_side_identifier}\"\r\n\r\n# Output results to Activity Feed\r\n_console_iscsi_connections=\"Connection Identifier${_delimiter}Initiator Address${_delimiter}Initiator Port${_delimiter}Target Address${_delimiter}Target Port\\n${_iscsi_connections}\"\r\n_console_iscsi_sessions=\"Auth Type${_delimiter}Name${_delimiter}Init Address${_delimiter}Init Portal Address${_delimiter}Init Side ID${_delimiter}Connected${_delimiter}Data Digest${_delimiter}Persistent${_delimiter}LUNs${_delimiter}SID${_delimiter}Tgt Node Address${_delimiter}Tgt Side Identifier\\n${_iscsi_sessions}\"\r\n# Print the result to activity feed\r\necho -e \"\\n---${_title_connections}---\"\r\necho -e \"${_console_iscsi_connections}\" | column -t -s ';'\r\necho -e \"\\n---${_title_sessions}---\"\r\n\r\n# Check if there are no active iSCSI sessions\r\nif [[ \"${session}\" == *\"No active sessions\"* || $(echo \"$session\" | wc -l) -le 1 ]]; then\r\n    echo \"No active iSCSI sessions\"\r\n    # If no sessions are active, notify that no data to be saved to custom field\r\n    if [[ -n \"${_arg_WYSIWYGCustomFieldName}\" ]]; then\r\n        echo \"[Info] No data to save to custom field.\"\r\n    fi\r\n    exit 0\r\nelse\r\n    echo -e \"${_console_iscsi_sessions}\" | column -t -s ';'\r\nfi\r\n\r\n# Add Headers\r\n_iscsi_connections=\"Connection Identifier${_delimiter}Initiator Address${_delimiter}Initiator Port${_delimiter}Target Address${_delimiter}Target Port\\n${_iscsi_connections}\"\r\n_iscsi_sessions=\"Authentication Type${_delimiter}Initiator Name${_delimiter}Initiator Node Address${_delimiter}Initiator Node Portal Address${_delimiter}Initiator Side Identifier${_delimiter}Is Connected${_delimiter}Is Data Digest${_delimiter}Is Persistent${_delimiter}Number of LUNs${_delimiter}Session Identifier${_delimiter}Target Node Address${_delimiter}Target Side Identifier\\n${_iscsi_sessions}\"\r\n\r\n# Convert the CSV result to an HTML table\r\nhtml_connections_result=$(convertToHTMLTable \"$_iscsi_connections\" --delimiter \"${_delimiter}\")\r\nhtml_sessions_result=$(convertToHTMLTable \"$_iscsi_sessions\" --delimiter \"${_delimiter}\")\r\n\r\n# Combine the results\r\nhtml_result+=\"&lt;h3&gt;${_title_connections}&lt;\/h3&gt;\"\r\nhtml_result+=\"$html_connections_result\"\r\nhtml_result+=\"&lt;h3&gt;${_title_sessions}&lt;\/h3&gt;\"\r\nhtml_result+=\"$html_sessions_result\"\r\n\r\nif [[ -n \"${_arg_WYSIWYGCustomFieldName}\" ]]; then\r\n    SetCustomField \"$_arg_WYSIWYGCustomFieldName\" \"$html_result\"\r\nfi<\/pre>\n<p>&nbsp;<\/p>\n\n<h2>Description d\u00e9taill\u00e9e<\/h2>\n<p>Voici comment fonctionne le script, \u00e9tape par \u00e9tape :<\/p>\n<h3>1. Contr\u00f4les pr\u00e9alables et analyse des arguments<\/h3>\n<ul>\n<li><strong>Privil\u00e8ges root :<\/strong>\u00a0Le script doit \u00eatre ex\u00e9cut\u00e9 en tant que root pour interroger les sessions iSCSI.<\/li>\n<li><strong>V\u00e9rifications des d\u00e9pendances :<\/strong>\u00a0V\u00e9rifie que iscsiadm est install\u00e9 et que \/etc\/iscsi\/iscsid.conf existe.<\/li>\n<li><strong>Argument facultatif :<\/strong>\u00a0Accepte un param\u00e8tre &#8211;WYSIWYGCustomFieldName pour sp\u00e9cifier un champ personnalis\u00e9 NinjaOne \u00e0 \u00e9diter.<\/li>\n<\/ul>\n<h3>2. Ex\u00e9cution des commandes et collecte des donn\u00e9es<\/h3>\n<ul>\n<li>Ex\u00e9cute iscsiadm -m session -P 3 pour extraire les informations verbales de la session.<\/li>\n<li>Analyse les donn\u00e9es telles que :\n<ul>\n<li>\u00c9tat de la connexion<\/li>\n<li>Type d&rsquo;authentification (CHAP ou Aucune)<\/li>\n<li>Adresses de la cible et de l&rsquo;initiateur<\/li>\n<li>Portail et identifiants de session<\/li>\n<li>Nombre de LUN (Logical Unit Numbers)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>3. Structuration des donn\u00e9es<\/h3>\n<ul>\n<li>Enregistre les d\u00e9tails de la connexion dans des cha\u00eenes d\u00e9limit\u00e9es par des points-virgules.<\/li>\n<li>Formate les \u00ab\u00a0Connexions\u00a0\u00bb et les \u00ab\u00a0Sessions\u00a0\u00bb en sorties lisibles sous forme de tableaux.<\/li>\n<\/ul>\n<h3>4. Conversion HTML<\/h3>\n<p>Une fonction convertToHTMLTable transforme les donn\u00e9es d\u00e9limit\u00e9es en tableaux HTML valides. Cela permet un affichage riche dans les interfaces utilisateur supportant le HTML, comme le champ WYSIWYG de NinjaOne.<\/p>\n<h3>5. Sortie optionnelle vers NinjaOne<\/h3>\n<p>Si un champ WYSIWYG valide est fourni, le script utilise ninjarmm-cli pour pousser le r\u00e9sultat au format HTML dans le champ personnalis\u00e9, garantissant ainsi que les donn\u00e9es sont facilement accessibles depuis le tableau de bord NinjaOne.<\/p>\n<h3>6. Sortie de la console visuelle<\/h3>\n<p>En plus d&rsquo;envoyer les donn\u00e9es dans NinjaOne, le script imprime les r\u00e9sum\u00e9s de connexion et de session directement sur la console en utilisant la colonne -t pour un formatage align\u00e9.<\/p>\n<h2>Cas d&rsquo;utilisation potentiels<\/h2>\n<h3>\u00c9tude de cas\u00a0: MSP Monitoring High-Availability iSCSI Storage (Surveillance du stockage iSCSI \u00e0 haute disponibilit\u00e9)<\/h3>\n<p>Un fournisseur de services g\u00e9r\u00e9s (MSP) entretient un cluster de serveurs Linux connect\u00e9s \u00e0 un SAN centralis\u00e9 via iSCSI. Il arrive qu&rsquo;un ou plusieurs serveurs soient confront\u00e9s \u00e0 des probl\u00e8mes de latence de stockage. Le <a href=\"https:\/\/www.ninjaone.com\/fr\/quest-ce-quun-msp\/\">MSP<\/a> d\u00e9ploie ce script via NinjaOne pour qu&rsquo;il s&rsquo;ex\u00e9cute automatiquement chaque semaine, en stockant l&rsquo;\u00e9tat de la session, les IP cibles et le nombre de LUN dans des champs personnalis\u00e9s. Lorsque la latence est d\u00e9tect\u00e9e, l&rsquo;\u00e9quipe peut rapidement \u00e9tablir une corr\u00e9lation entre les changements de stockage et les r\u00e9gressions de performances, ce qui permet d&rsquo;\u00e9conomiser des heures de diagnostic.<\/p>\n<h2>Comparaisons<\/h2>\n<table>\n<tbody>\n<tr>\n<td style=\"text-align: center;\"><strong>M\u00e9thode<\/strong><\/td>\n<td style=\"text-align: center;\"><strong>Description<\/strong><\/td>\n<td style=\"text-align: center;\"><strong>Pr\u00eat pour l&rsquo;automatisation<\/strong><\/td>\n<td style=\"text-align: center;\"><strong>Visualisation<\/strong><\/td>\n<td style=\"text-align: center;\"><strong>Int\u00e9gration de NinjaOne<\/strong><\/td>\n<\/tr>\n<tr>\n<td>iscsiadm manuellement<\/td>\n<td>Outil CLI brut<\/td>\n<td>\u274c<\/td>\n<td>\u274c<\/td>\n<td>\u274c<\/td>\n<\/tr>\n<tr>\n<td>Analyse Bash personnalis\u00e9e<\/td>\n<td>Logique d&rsquo;analyse personnalis\u00e9e<\/td>\n<td>\u26a0\ufe0f<\/td>\n<td>\u274c<\/td>\n<td>\u274c<\/td>\n<\/tr>\n<tr>\n<td><strong>Ce script<\/strong><\/td>\n<td>Automatisation compl\u00e8te + sortie HTML<\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>D&rsquo;autres m\u00e9thodes n\u00e9cessitent une interpr\u00e9tation manuelle ou des outils externes. Ce script offre une solution automatis\u00e9e de bout en bout, adapt\u00e9e aux RMM.<\/p>\n<h2>FAQ<\/h2>\n<h3>Q\u00a0: Ce script modifie-t-il la configuration du syst\u00e8me ?<\/h3>\n<p>R\u00a0: Non. Il est strictement en lecture seule et sans danger pour les diagnostics.<\/p>\n<h3>Q\u00a0: Que se passe-t-il si aucune session iSCSI n&rsquo;est active ?<\/h3>\n<p>R\u00a0: Il quitte le syst\u00e8me et signale qu&rsquo;il n&rsquo;y a pas de session active, \u00e9vitant ainsi les mises \u00e0 jour inutiles des champs.<\/p>\n<h3>Q\u00a0: Existe-t-il une limite de caract\u00e8res pour les champs personnalis\u00e9s ?<\/h3>\n<p>R\u00a0: Oui. Le script \u00e9met un avertissement si la sortie HTML d\u00e9passe 10 000 caract\u00e8res, ce qui est une limite typique pour les champs NinjaOne.<\/p>\n<h3>Q\u00a0: Avec quelles plateformes est-il compatible ?<\/h3>\n<p>R\u00a0: Ce script est con\u00e7u pour les syst\u00e8mes Linux sur lesquels iscsiadm est install\u00e9 et les agents NinjaOne sont configur\u00e9s.<\/p>\n<h2>Implications<\/h2>\n<p>En utilisant un script shell sur Linux pour obtenir les d\u00e9tails des connexions iSCSI, les \u00e9quipes informatiques b\u00e9n\u00e9ficient d&rsquo;une visibilit\u00e9 structur\u00e9e sur les couches de stockage, qui sont souvent \u00e0 l&rsquo;origine de probl\u00e8mes complexes de performance ou de fiabilit\u00e9. De plus, l&rsquo;int\u00e9gration de cette visibilit\u00e9 directement dans les tableaux de bord RMM permet un triage plus rapide, r\u00e9duit les temps d&rsquo;arr\u00eat et am\u00e9liore la transparence pour les clients.<\/p>\n<p>Sur le plan de la s\u00e9curit\u00e9, l&rsquo;exposition d&rsquo;informations au niveau de la session facilite \u00e9galement l&rsquo;audit. Il est essentiel d&rsquo;identifier les cibles connect\u00e9es et de savoir si l&rsquo;authentification CHAP est en place pour garantir des configurations s\u00e9curis\u00e9es.<\/p>\n<h2><strong>Recommandations<\/strong><\/h2>\n<ul>\n<li><strong>Planifier des ex\u00e9cutions p\u00e9riodiques :<\/strong>\u00a0Utilisez les strat\u00e9gies ou l&rsquo;automatisation de NinjaOne pour ex\u00e9cuter ce script \u00e0 intervalles r\u00e9guliers.<\/li>\n<li><strong>Contr\u00f4ler la taille des champs :<\/strong>\u00a0Assurez-vous que les champs personnalis\u00e9s ne sont pas tronqu\u00e9s en raison des limites de caract\u00e8res.<\/li>\n<li><strong>Ex\u00e9cution s\u00e9curis\u00e9e :<\/strong>\u00a0Toujours ex\u00e9cuter avec les privil\u00e8ges de root sur des agents s\u00e9curis\u00e9s et de confiance.<\/li>\n<li><strong>Combinaison avec les alertes :<\/strong>\u00a0Cr\u00e9ez des alertes NinjaOne bas\u00e9es sur les valeurs des champs (par exemple, \u00ab\u00a0Aucune session active\u00a0\u00bb ou \u00ab\u00a0Cible inattendue\u00a0\u00bb).<\/li>\n<\/ul>\n<h2><strong>Conclusion<\/strong><\/h2>\n<p>Les utilisateurs de NinjaOne qui souhaitent approfondir leurs capacit\u00e9s de surveillance et de diagnostic devraient envisager de d\u00e9ployer ce script. Il illustre la mani\u00e8re dont\u00a0<strong>le script shell sur Linux peut \u00eatre exploit\u00e9 pour obtenir les d\u00e9tails de la connexion iSCSI<\/strong>\u00a0d&rsquo;une mani\u00e8re qui soit \u00e0 la fois automatisable et lisible par l&rsquo;homme. Gr\u00e2ce \u00e0 son int\u00e9gration dans les champs personnalis\u00e9s de NinjaOne, il transforme les donn\u00e9es obscures des sessions de stockage en informations exploitables, am\u00e9liorant ainsi l&rsquo;<a href=\"https:\/\/www.ninjaone.com\/fr\/efficacite\/\">efficacit\u00e9<\/a> op\u00e9rationnelle et la r\u00e9activit\u00e9.<\/p>\n<p>Pour les flux de travail plus avanc\u00e9s, ce script peut servir de mod\u00e8le pour l&rsquo;extension \u00e0 d&rsquo;autres diagnostics de protocole, faisant de <a href=\"https:\/\/www.ninjaone.fr\/\" target=\"_blank\" rel=\"noopener\">NinjaOne<\/a> non seulement un outil de surveillance mais un v\u00e9ritable centre de commande op\u00e9rationnel.<\/p>\n","protected":false},"author":35,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"_relevanssi_hide_post":"","_relevanssi_hide_content":"","_relevanssi_pin_for_all":"","_relevanssi_pin_keywords":"","_relevanssi_unpin_keywords":"","_relevanssi_related_keywords":"","_relevanssi_related_include_ids":"","_relevanssi_related_exclude_ids":"","_relevanssi_related_no_append":"","_relevanssi_related_not_related":"","_relevanssi_related_posts":"","_relevanssi_noindex_reason":"","_lmt_disableupdate":"no","_lmt_disable":""},"operating_system":[4211],"use_cases":[4281],"class_list":["post-513829","script_hub","type-script_hub","status-publish","hentry","script_hub_category-linux"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.ninjaone.com\/fr\/wp-json\/wp\/v2\/script_hub\/513829","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ninjaone.com\/fr\/wp-json\/wp\/v2\/script_hub"}],"about":[{"href":"https:\/\/www.ninjaone.com\/fr\/wp-json\/wp\/v2\/types\/script_hub"}],"author":[{"embeddable":true,"href":"https:\/\/www.ninjaone.com\/fr\/wp-json\/wp\/v2\/users\/35"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ninjaone.com\/fr\/wp-json\/wp\/v2\/comments?post=513829"}],"wp:attachment":[{"href":"https:\/\/www.ninjaone.com\/fr\/wp-json\/wp\/v2\/media?parent=513829"}],"wp:term":[{"taxonomy":"script_hub_category","embeddable":true,"href":"https:\/\/www.ninjaone.com\/fr\/wp-json\/wp\/v2\/operating_system?post=513829"},{"taxonomy":"use_cases","embeddable":true,"href":"https:\/\/www.ninjaone.com\/fr\/wp-json\/wp\/v2\/use_cases?post=513829"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}