
/etc/init.d/sudo
私はUbuntu 14.04 Linuxシステムでこのスクリプトを見ています。台本を読んでこのようなフレーズを見つけました。
find /var/lib/sudo -exec touch -d @0 '{}' \;
ここでのポイントは何ですか@0
?上記のステートメントは何をしますか?
答え1
bash
これはまたはとは何の関係もありませんsudo
。このfind
コマンドは-exec
ジョブを使用して、見つかった各ファイルに対して指定されたコマンドを実行します。この場合、実行されるコマンドは次のようになります。
touch -d @0
man touch
GNUシステムをチェックすると、次のようなものが見つかります。
-d, --date=STRING
parse STRING and use it instead of current time
したがって、これは-d
ターゲットファイルに設定したい日付を選択する1つの方法です。 GNU実装は、これが次のように定義された日付であることをtouch
伝えます。@
touch
エポック以降。実際には0秒なので、UNIX時間の開始を意味します。これを確認する簡単な方法は、date
GNUコマンドに同じ日付を提供することです。
$ TZ=UTC date -d @0
Thu Jan 1 00:00:00 UTC 1970
したがって、表示されるコマンドはその中のすべてのファイルとディレクトリを検索し、最後の/var/lib/sudo
変更日を1970年1月1日木曜日00:00 UTCに設定します。
この行が存在する理由は、次によく説明されています。コメント次のように:
@crisronこの行の目的は、以前のsudoインスタンスのすべてのsudoパスワードが期限切れになっていることを確認することです。ユーザーが初めてsudoを実行すると、セッションごとにこのディレクトリにファイルが作成されます。その後、Sudoは次回実行されるときにファイルのタイムスタンプをチェックして、パスワードを尋ねるかどうかを判断します。この行は、sudoデーモンが再起動したときにユーザーが次にsudo操作を実行したときにすべてのパスワードを再入力する必要があることを保証します。 – クロウ
答え2
@0
エポックの日付です。より一般的には、@xはエポック以降のx秒です。たとえば、
$ touch -d @0 foo
$ TZ=UTC0 ls -l foo
-rw-r--r-- 1 vinc17 vinc17 0 1970-01-01 00:00:00 foo
注:-d
このユーティリティのオプションはtouch
次のとおりです。POSIXで指定しますが、ISO8601フォーム文字列にのみ適用されます。。異なる形式の文字列は、各実装によって異なります。特に@x形式はGNU拡張です。
答え3
この行は次のことを行います。
/var/lib/sudo作業ディレクトリを定義します。
-exec タッチ -d @0 '{}'\;実行する操作です。これをいくつかの部分に分けてみましょう。
-実現する実際の行動前。
タッチ-dファイルタイムスタンプの解析パラメータ文字列を変更し、現在の時刻の代わりに使用します。
@0タイムスタンプで、次のようになります。
root@debian:/var/log# date -d @0
Wed Dec 31 21:00:00 ART 1969
したがって、結論は次のようになります。
findコマンドが一致するものが見つかると、タイムスタンプはWed Dec 31 21:00:00 ART 1969に更新されます。