sudo中に特定の所有者(ユーザー/グループ)でファイルとディレクトリを作成する

sudo中に特定の所有者(ユーザー/グループ)でファイルとディレクトリを作成する

何かを行う必要がありwget(cwd で圧縮されたファイルになります)、それを解凍し、コピー/移動/変更を行って、最後にスクリプト (ダウンロードしたアーカイブから) を実行する必要があります。

現在、これらすべてのタスクは、直接的 ( wget、抽出など) または間接的 (スクリプトの実行) に、ファイルとディレクトリ (すべて現在の作業ディレクトリ内) を作成します。私はこれらすべてをroot(最終的な目的のユーザーで実行する方法はありません) として実行します。

問題は、プロセスで作成されたものはすべて、root または sudo ユーザーが所有することです。完了したら (場合によっては途中でも)、一連のchmodおよびchownコマンドを発行して、問題を修正する必要があります。

ここで、何らかの方法でシステムに「今後、ルートとしてコマンドを発行したときに作成されるすべてのファイルまたはディレクトリは、このような所有権と権限で作成されます」と伝えることができれば便利です。

答え1

sudo -u username touch filenameスクリプトを として実行すると、いつでもパスワードを入力できますroot。設定によっては、通常はパスワードは必要ありませんsudoers

あるいは、 を実行しますsu username -c touch filename。追加の引数はユーザーのシェルに提供され、-cシェルのオプションは慣例に従って指定されたコマンドを実行します。


一部のコマンド (などmkdir) は、権限を指定するための引数をサポートしています。

mkdir -m 0700 foo

デフォルトでは、ファイル操作はumaskシェルの設定に従います。シェルは、どの権限が拒否されましたumask例えば、0022ないグループと他のユーザーに対して書き込み権限を設定します。 に設定すると、0077グループと他のユーザーが権限を取得できなくなります。


ディレクトリを設定するsetgidと、そのディレクトリ内で作成されたすべてのファイルがグループ メンバーシップを継承します。

chmod g+s someDir

いくつかのUnixサポートsetuid( )でも同じ動作ですchmod u+sが、Linux ではそうではありません。

答え2

もう一つの方法があります。かなりエレガントだと思います。install(1) を使用する

たとえば、zabbix-agentd は /var/run 内にサブフォルダが必要ですが、最近のディストリビューションでは /var/run に tmpfs を使用しているため、このディレクトリは再起動すると消えてしまいます。私は、次の内容を含む /etc/sysconfig/zabbix-agentd ファイルを作成することでこの問題を解決しました。

install -g zabbix -o zabbix -d /var/run/zabbix

答え3

Unix 系システムでは、新しく作成されたファイルとディレクトリは、それらを作成したプロセスの所有者によって所有されます。標準ユーティリティには通常、作成されたファイルの所有者を変更するオプションはありません。

元のユーザーの UID と GID を持つ変数

いくつかのコマンドを繰り返し実行する場合、変数$SUDO_UIDと を使用して、$SUDO_GIDを呼び出したユーザーを参照できますsudo

sudo sh -c "do_something ; chown -R \"\$SUDO_UID:\$SUDO_GID\" files and directories"

作成されたファイルとディレクトリのリストを自動的に取得する

作成された(および変更された可能性のある)ファイルとディレクトリのリストを自動的に取得したい場合は、システムコールstraceに基づく監視下でコマンドを実行できますptrace()

strace -qqfe open,creat,mkdir,link,symlink,mknod -o '|your_processing_of_strace_output' do_something

または例えばインストールウォッチメカニズムに基づいていますLD_PRELOAD

今後の取り組みのアイデア

上記の方法に基づいて、作成/変更されたファイルの所有者とアクセス権を自動的に変更するツールを作成できます。使い方は次のように簡単です。

sudo watch-chown do_something

関連情報