如何设置脚本以非交互方式以 root 身份运行?

如何设置脚本以非交互方式以 root 身份运行?

我需要设置以下脚本来运行作为根用户每当我登录时:

#!/bin/zsh
truncate -s 0 ~yourstruly/.juniper_networks/network_connect/ncsvc.log

我知道如何以 root 身份交互运行脚本(即通过sudo),但我不知道如何使脚本以 root 身份运行非交互地每当我登录时。

我怎样才能做到这一点?

FWIW:该脚本当前由root拥有,权限为6755,要截断的文件也由root拥有,权限为0644,但是当我运行脚本时,调用truncate失败并出现“权限被拒绝”错误。

答案1

脚本的权限是无关的。脚本上的 Setuid 和 setgid 位被忽略在 Linux 和大多数其他 unice 上。

您可以配置 sudo 以允许您使用标签运行此脚本而无需指定密码NOPASSWD。确保sudo不需要连接到终端:关闭该requiretty选项。请注意,NOPASSWD-tagged 规则必须位于允许您在密码提示下运行命令的任何其他规则之前,因为第一个匹配适用。所以运行visudo

Defaults !requiretty
kjo ALL = NOPASSWD: /path/to/nc-logs-truncate
kjo ALL = (ALL) ALL

将脚本的第一行更改为#!/bin/zsh -f,否则 zsh 将加载~/.zshenv,这是不希望的。

现在我已经回答了您的字面问题,这可能不是最好的方法。一个简单的方法chown kjo ~/.juniper_networks/network_connect/ncsvc.log就是确保日志文件属于您,以便您可以随意截断它。

更好的是,移动日志文件而不是截断它:保留最近的日志通常很有用(例如,如果 nc 失败,则将工作日志与非工作日志进行比较)。授予自己对该目录的写入权限(您可能已经拥有该目录)并

mv -f ~/.juniper_networks/network_connect/ncsvc.log ~/.juniper_networks/network_connect/ncsvc.log.0
touch ~/.juniper_networks/network_connect/ncsvc.log

或者,制作一个更unixy的NC包,告诉ncsvc将其日志写入/var/log,并将其日志包含在logrotate配置中。

相关内容