Linux 如何执行';iftop&x27;没有sudo

Linux 如何执行';iftop&x27;没有sudo,linux,unix,sudoers,Linux,Unix,Sudoers,我有一个脚本,它以文本模式运行iftop,将输出减少到我所关心的内容,并将其与date命令的输出一起保存到一个文本文件中(随着时间的推移,我正在监视各种接口上的网络使用情况)。我遇到的唯一问题是,我试图通过crontab每隔15分钟运行一次脚本,为了运行iftop命令,我需要sudo权限。是否有人知道如何更改iftop的权限,从而使我不需要sudo权限 或者,如果我可以让脚本能够使用sudo运行命令,我也可以这样做。我尝试通过sudovisudo将脚本添加到sudoers文件,并添加以下行: u

我有一个脚本,它以文本模式运行
iftop
,将输出减少到我所关心的内容,并将其与
date
命令的输出一起保存到一个文本文件中(随着时间的推移,我正在监视各种接口上的网络使用情况)。我遇到的唯一问题是,我试图通过crontab每隔15分钟运行一次脚本,为了运行
iftop
命令,我需要sudo权限。是否有人知道如何更改
iftop
的权限,从而使我不需要sudo权限

或者,如果我可以让脚本能够使用sudo运行命令,我也可以这样做。我尝试通过
sudovisudo
将脚本添加到sudoers文件,并添加以下行:

user ALL=(ALL)NOPASSWD:/home/user/network\u usage.sh

但这不起作用…也许是从crontab执行的结果

谢谢


-Eric

如果您在计算机上以快速且肮脏的方式拥有root访问权限:

chmod +s $(which iftop)
这将使它以root权限运行,无论是谁调用它。
但是我仍然认为您的sudo-like应该可以运行。

您可以使用root的crontab来运行脚本。 如果使用
sudo crontab-e
而不是
crontab-e
,您将编辑root用户的crontab。该文件中指定的任务将在root的帐户和权限下运行

或者,您可以为脚本文件设置setuid访问标志。要执行此操作,请首先将文件的所有者更改为root,然后按如下方式启用setuid:

sudo chown root /home/user/network_usage.sh
sudo chmod +s-w /home/user/network_usage.sh
setuid位使可执行文件以其所有者的有效UID运行

无论你采取什么方法,都要非常小心

  • 将您的脚本归root所有,不要让任何其他用户对其进行写入,否则可能会简化权限升级
  • 请注意setuid程序的副作用。如果脚本具有setuid并且可能创建或修改文件,则其他人可能会使用它来修改或创建他们不应该使用的文件。在向任何尚未编写的程序提供setuid之前,请务必检查手册

更精细的方法是使用:

# setcap cap_net_raw=eip $(which iftop)
这允许iftop捕获数据包,但不授予进程完全根权限。如果出现带有“iftop”的安全问题或bug,其副作用将非常有限


相关:

你能详细说明一下sudo版本在哪些方面不起作用吗?就我而言,这应该行得通……这是你的crontab中的
sudo/home/user/network\u用法。sh
吗?我的脚本应该输出
interface\u sent:rate
interface\u received:rate
,但目前速率为空(我猜脚本的一部分因为sudo问题而无法运行). 另外,如果我尝试手动执行脚本,它仍然会要求输入sudo密码。不,crontab中没有sudo,只有脚本中没有。将sudo添加到crontab会有所不同吗?我尝试了sudo crontab,它成功了,感谢这两种方法,尽管我很欣赏深入的答案。谢谢你。节省了我很多时间。