Ubuntu 在不使用sudo的情况下使用smartctl

Ubuntu 在不使用sudo的情况下使用smartctl,ubuntu,sudo,smart-device,Ubuntu,Sudo,Smart Device,我有一台Ubuntu服务器(3.19.0-21-generic\21 Ubuntu SMP Sun Jun 14 18:31:11 UTC 2015 x86\u 64 Linux-3.19.0-21-generic-x86\u 64-with-Ubuntu-15.04-vivid)。它有一个4磁盘RAID-6阵列。我通过使用以下Python代码定期询问每个磁盘来关注磁盘的运行状况: t1 = time.time() if ((t1 - self.lasttime) > (4.5*60)):

我有一台Ubuntu服务器(
3.19.0-21-generic\21 Ubuntu SMP Sun Jun 14 18:31:11 UTC 2015 x86\u 64 Linux-3.19.0-21-generic-x86\u 64-with-Ubuntu-15.04-vivid
)。它有一个4磁盘RAID-6阵列。我通过使用以下Python代码定期询问每个磁盘来关注磁盘的运行状况:

t1 = time.time()
if ((t1 - self.lasttime) > (4.5*60)):
  self.vars     = commands.getoutput("sudo smartctl -A " + self.diskid + " |awk 'NR>4'").splitlines()
  self.health   = commands.getoutput("sudo smartctl -H " + self.diskid + " |awk 'NR>4'").splitlines()
  self.selftest = commands.getoutput("sudo smartctl -l selftest " + self.diskid + "  |grep '\# 1'")
  self.lasttime = t1
其中
self.diskid
是(显然是磁盘ID),例如
/dev/sdc
。 我使用这些命令的输出来跟踪各种磁盘参数(例如温度和状态),并对数据进行后处理,以便在网页上报告(图形和文本状态)

我也喜欢关注日志,但是上面的命令垃圾处理了大量类似这样的东西:

Jun 17 16:46:07 boson sudo[18429]: beheer : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/sbin/smartctl -l selftest /dev/sdc
Jun 17 16:46:07 boson sudo[18429]: pam_unix(sudo:session): session opened for user root by (uid=0)
Jun 17 16:46:07 boson sudo[18429]: pam_unix(sudo:session): session closed for user root
对于发出的每个smartctl命令和对每个磁盘重复的每个命令,都有一个。 这使得浏览日志时很难发现奇怪之处。我知道
journalctl
的过滤功能,但它们没有真正的帮助。它还导致日志变得不合理地大,我认为这是一个问题

所以,为了减轻我的压力,我想我可能会放弃sudo。但是,显然
smartctl
需要root权限

我在
/etc/sudoers
中添加了
nobody ALL=NOPASSWD:/usr/sbin/smartctl

然后,例如,
smartctl-H/dev/sdc
似乎可以工作,但返回一个错误:

Smartctl open device: /dev/sdc failed: Permission denied
因此,我将我的管理员帐户添加到
磁盘

现在,
smartctl-H/dev/sdc
似乎仍在工作,但返回此消息

Probable ATA device behind a SAT layer
Try an additional '-d ata' or '-d sat' argument.
Probable ATA device behind a SAT layer
Try an additional '-d ata' or '-d sat' argument.
这就是我被困的地方

对于那些想知道:

$ sudo smartctl -H /dev/sdc
smartctl 6.4 2014-10-07 r4002 [x86_64-linux-3.19.0-21-generic] (local build)
Copyright (C) 2002-14, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
因此,使用
sudo
可以得到预期的结果

smartmontools
已安装:

$ dpkg -l smartmontools
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                        Version            Architecture       Description
+++-===========================-==================-==================-===========================================================
ii  smartmontools               6.3+svn4002-2      amd64              control and monitor storage systems using S.M.A.R.T.


$ systemctl list-units |grep smart
  smartd.service        loaded active running   Self Monitoring and Reporting Technology (SMART) Daemon
  • 限制可以运行此命令的用户。类似这样的内容:
    sudo chmod o-x/usr/sbin/smartctl&&sudo chown:admin/usr/sbin/smartctl
  • 使用
    sudo chmod u+s/usr/sbin/smartctl
    允许任何运行此命令的人—它将以root权限运行
  • 我想这应该在安装脚本中运行,因为没有root权限时,命令
    smartctl
    是无用的,应该只由管理员组运行

    因此,我将管理员帐户添加到磁盘组

    现在,
    smartctl-H/dev/sdc
    似乎仍然可以工作,但返回了这个 信息

    Probable ATA device behind a SAT layer
    Try an additional '-d ata' or '-d sat' argument.
    
    您是否按照建议尝试了额外的
    -d ata
    -d sat
    ?在我的设置下,添加设备类型(
    -data
    用于我的)可以让它在用户进入“磁盘”组后工作


    我短暂地启动了
    strace
    ,似乎其中一个
    ioctl()
    调用以确定正在使用的设备类型需要根权限或其他什么?

    您可以考虑安装和配置
    smartmontools
    作为替代…@twalberg:
    smartmontools
    已安装。这就是我得到smartctl的原因——啊,是的
    smartd(也在该软件包中)是我想到的-它可以配置为执行各种类型的通知、计划定期测试等。。。而不是你自己滚…我也在用它。请详细说明。作为旁白,从Python调用Awk是疯狂的。添加新的SUID程序通常是不可取的。@tripleee通常是的。但是,您是否看到在这种特定情况下有任何问题?如果这解决了
    sdc
    错误消息,而
    sudo
    没有,请解释它是如何工作的。如果不是的话,我看不出这比OP已经在做的事情有什么好处。