Permissions

如何設置腳本以非互動方式以 root 身份執行?

  • March 2, 2013

每次登錄時,我都需要設置以下腳本以root身份執行:

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

我知道如何以 root 互動方式執行腳本(即 through sudo),但我不知道如何讓腳本在登錄時以非互動方式執行。

我怎樣才能做到這一點?

FWIW:腳本目前歸 root 所有,權限為 6755,要截斷的文件也歸 root 所有,權限為 0644,但是當我執行腳本時,呼叫truncate失敗並出現“權限被拒絕”錯誤。

腳本的權限無關緊要。在 Linux 和大多數其他 unice上的腳本中,Setuid 和 setgid 位被忽略。

您可以配置 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

或者,製作一個更統一的 NC 包,告訴ncsvc將其日誌寫入/var/log,並將其日誌包含在logrotate配置中。

引用自:https://unix.stackexchange.com/questions/66616