如何在没有 sudo 的情况下执行 'iftop'

How to execute 'iftop' without sudo

我有一个脚本 运行s iftop 在文本模式下,将输出缩减为我所关心的内容,并将其与输出一起保存到文本文件中date 命令(我一直在监视各种接口上的网络使用情况)。我遇到的唯一问题是我试图通过 crontab 每 15 分钟 运行 我的脚本,并且为了 运行 iftop 命令我需要 sudo 权限。有谁知道一些方法来更改 iftop 的权限以使其不需要 sudo 权限?

或者,如果我可以让脚本能够 运行 使用 sudo 命令,那对我来说也很好。我尝试通过 sudo visudo 将脚本添加到 sudoers 文件并添加行:

user ALL=(ALL) NOPASSWD: /home/user/network_usage.sh

但这没有用...可能是从 crontab 执行的结果?

谢谢,

-埃里克

如果您在计算机上具有 root 访问权限,则使用快速而肮脏的方法:

chmod +s $(which iftop)

这将使它 运行 具有 root 权限,无论谁调用它。 但我仍然认为你的 sudo 应该 工作。

您可以使用 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 捕获数据包,但不会给进程完全的 root 权限。如果 "iftop" 出现安全问题或错误,其副作用将更加有限。

相关:https://unix.stackexchange.com/questions/189750/how-can-i-run-script-without-root-to-sniff-network-libpcap