実行するには、次のスクリプトを設定する必要があります。rootユーザーとしてログインするたびに:
#!/bin/zsh
truncate -s 0 ~yourstruly/.juniper_networks/network_connect/ncsvc.log
スクリプトをrootとしてインタラクティブに実行する方法を知っていますが(たとえば経由でsudo
)、スクリプトをrootとして実行する方法がわかりません。非対話型ログインするたびに。
どうすればいいですか?
FWIW:スクリプトは現在権限6755を持つルートによって所有されており、切り捨てられたファイルも権限0644を持つルートによって所有されていますが、スクリプトを実行するとtruncate
「許可拒否」エラーで呼び出しが失敗します。
答え1
スクリプト権限は関係ありません。スクリプトの Setuid および setgid ビットは無視されます。Linuxと他のほとんどのuniceで。
パスワードを指定せずにラベルを使用してこのスクリプトを実行できるようにsudoを設定できますNOPASSWD
。sudo
端末に接続する必要がないことを確認してください。requiretty
このオプションをオフにしてください。最初の一致が適用されるため、-taggedルールはNOPASSWD
パスワードプロンプトでコマンドを実行できる他のルールより前にする必要があります。したがって、以下を実行してください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
ncsvc
または、ログを作成するように指示するもう少しユニークなNCパッケージを作成し、その/var/log
ログをlogrotate
設定に含めます。