簡體   English   中英

在 Python 中遠程執行命令

[英]Remote execution of command in Python

我絕不會經常編寫腳本,但我正在嘗試編寫一個 Nagios 插件來檢查遠程主機上 RAID 控制器的狀態。 問題是獲取輸出的命令需要提升的權限。 什么是正確且最有效的方法來實現這一目標? 目標是運行:

'/opt/MegaRAID/MegaCli/MegaCli64 -ShowSummary -a0'

在監控服務器的遠程主機上,

然后按照這個邏輯的基本思路:

#Nagios Plugin for Testing LSI Raid Status
import os, sys
import argparse
import socket
import subprocess
#nagios exit codes do not change#
OK = 0
WARNING = 1
CRITICAL = 2
DEPENDENT = 3
UNKNOWN = 4
#nagios exit codes do not change#
#patterns to be searched
active = str("Active")
online = str("Online")
k = str("OK")
degrade = str("Degraded")
fail = str("Failed")
parser = argparse.ArgumentParser(description='Py3 script for monitoring RAID status.')
#arguments
parser.add_argument("--user",
       metavar = '-U',
       help = "username for remote connection")
parser.add_argument("--hostname",
        metavar = '-H',
        help = "hostname of the remote host")
args = parser.parse_args()
print(args)
#turning args into variables
hostname = args.hostname
user = args.user
ssh = subprocess.Popen(f"ssh {user}@{hostname} /opt/MegaRAID/MegaCli/MegaCli64 -ShowSummary -a0", shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
check = ssh.stdoutreadlines()
OK_STR = str("RAID is OK!")
WARN_STR = str("Warning! Something is wrong with the RAID!")
CRIT_STR = str("CRITICAL! THE RAID IS BROKEN")
UNK_STR = str("Uh oh! Something ain't right?")
if (degrade) in (check):
    print(WARN_STR) and exit(WARNING)
elif (fail) in (check):
    print (CRIT_STR) and exit(CRITICAL)
elif (active) or (online) or (k) in (check):
    print(OK_STR) and exit(OK)
else:
    print(UNK_STR) and exit(UNKNOWN)

有什么想法嗎? 這遠非我的強項(也是一個未完成的劇本),所以我為外行的格式和我的措辭中的任何混淆道歉。

我正在嘗試編寫一個 Nagios 插件來檢查遠程主機上 RAID 控制器的狀態。 問題是獲取輸出的命令需要提升的權限。 什么是正確且最有效的方法來實現這一目標?

我建議在有問題的系統上通過 NRPE 遠程運行腳本,然后為用戶提供 NRPE 守護程序作為(可能是nagios或類似的)運行的 sudo 權限,以使用一些非常精確的參數運行該腳本。

nrpe.cfg 文件提到了這個例子:

# Usage scenario:
# Execute restricted commmands using sudo.  For this to work, you need to add
# the nagios user to your /etc/sudoers.  An example entry for alllowing
# execution of the plugins from might be:
#
# nagios          ALL=(ALL) NOPASSWD: /usr/lib/nagios/plugins/

...但是沒有理由如此寬容,您可以通過只允許一個確切的命令來使其更安全:

nagios ALL = NOPASSWD: /usr/sbin/megacli

請注意,這允許使用該命令的任何參數,這甚至更安全,因為它不允許任何其他變體(示例):

nagios ALL = NOPASSWD: /usr/sbin/megacli -a foo -b bar -c5 -w1

然后配置 nrpe 命令以在它之前使用 sudo 運行上述命令,它應該可以工作。 您可以通過su :ing 到 nagios 用戶並自己嘗試 sudo 命令來進行驗證。

另外,請注意,您很可能可以為 python nagios 插件導入一些可用模塊,這使您更容易獲得對閾值及其語法等內容的內置支持。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM