Permissions
如何設置腳本以非互動方式以 root 身份執行?
每次登錄時,我都需要設置以下腳本以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
配置中。