rc.localがrootとして実行されている場合、なぜファイルに触れることができないのですか?

rc.localがrootとして実行されている場合、なぜファイルに触れることができないのですか?

私はそれがすべての始まりで使用されることを望みます/etc/rc.local

たとえば、私のスクリプトが呼び出され、startscript.sh保存場所/home/debianは次のようになります。まず、名前付きファイルを生成しようとしたtest.log後、別の操作を実行します。

しかし、起動時にエラーを読みました。touch: cannot touch ‘test.log’: Permission denied

rc.local私の理解によると、rootとして実行されると、実行されるすべてのエントリもrootとして実行される必要があるため、test.logとにかく生成する必要があります。どのようにこれが可能ですか?

startscript.sh:

#!/bin/sh
touch test.log
#... other stuff

rc.localフラグメント:

#!/bin/sh -e
#.. other stuff
sh /home/debian/startscript.sh

答え1

このアプローチには2つの問題があります。 1つはルートによって実行されることです。したがって、生成されたすべてのファイルは、実行しrc.localない限りルートが所有します。chown第二に、これはセキュリティ上の脆弱性であり、rootとして実行されたコードはroot権限を持たないユーザーによって修正される可能性があります。

より良い方法は、次を使用することです。@再起動cron権限のないユーザーの時間指定子。すでに持っているなら予約されたことファイルを編集してこの行を追加し、crontab <yourcrontab>コマンドを実行します。または、crontab -eコマンドを使用してこの行を直接入力します。

@reboot /home/debian/startscript.sh

shで始まるので、スクリプトを実行する必要はありません#!/bin/sh

答え2

ディストリビューションで以下を使用するsystemd場合/etc/rc.local早すぎる、ルートファイルシステムがまだ読み取り専用であるか、他のファイルシステムがまだマウントされていない間。

.service実行中のsystemdファイルがrc.local特定の順序の依存関係で構成されていない場合は、systemdできるだけ早く実行されます。

systemctl cat rc-local.service実行中のサービスの完全な定義を表示するには、実行してくださいrc.local。すべてのAfter=ラインに注意を払い、システム起動プロセスで満足できる最速のポイントを検討してください。After=設定要件に合わせて1〜2行を追加する上書きファイルを追加できます。

関連情報