web-dev-qa-db-ja.com

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

何かwgetする必要があります(その結果、cwdで圧縮ファイルが生成されます)。次に、それを抽出し、コピー/移動/変更などの処理を行い、最後に(ダウンロードしたアーカイブから)スクリプトを実行する必要があります。

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

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

「これからは、rootとしてコマンドを発行したときに作成するファイルやディレクトリはすべて、そのような所有権とアクセス許可で作成する」とシステムに何らかの方法で伝えることができればいいでしょう。

24

スクリプトがrootとして実行されるときはいつでもSudo -u username touch filenameを使用できます。 sudoers構成によっては、通常、パスワードは必要ありません。

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


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

mkdir -m 0700 foo

デフォルトでは、ファイル操作はシェルに設定されたumaskを尊重します。 拒否する権限を定義します。たとえば、umask of 0022は、グループおよびその他のユーザーに書き込み権限を設定しません。 0077に設定すると、グループや他のユーザーが権限を取得できなくなります。


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

chmod g+s someDir

一部のUnix supportsetuidchmod u+s)と同じ動作ですが、Linuxでは動作しません。

27
Daniel Beck

別の方法がありますが、かなりエレガントだと思います。 install(1)の使用

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

install -g zabbix -o zabbix -d /var/run/zabbix
11
Angelo Turetta

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

元のユーザーのUIDおよびGIDを持つ変数

一部のコマンドを繰り返し実行する場合は、変数_$Sudo_UID_および_$Sudo_GID_を使用して、Sudoを呼び出したユーザーを参照できます。

_Sudo sh -c "do_something ; chown -R \"\$Sudo_UID:\$Sudo_GID\" files and directories"
_

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

作成された(および場合によっては変更された)ファイルとディレクトリのリストを自動的に取得したい場合は、ptrace() syscallに基づくstrace surveillanceの下でコマンドを実行できます。

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

または、たとえば、_LD_PRELOAD_メカニズムに基づく Installwatch を使用できます。

さらなる仕事のアイデア

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

_Sudo watch-chown do_something
_
3
pabouk