我需要设置以下脚本来运行作为根用户每当我登录时:
#!/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
配置中。