何かwget
する必要があります(その結果、cwdで圧縮ファイルが生成されます)。次に、それを抽出し、コピー/移動/変更などの処理を行い、最後に(ダウンロードしたアーカイブから)スクリプトを実行する必要があります。
これらすべてのタスクは、直接的(wget
、抽出など)または間接的(スクリプトの実行)に行われ、ファイルとディレクトリが作成されます(すべて現在の作業ディレクトリにあります)。私はこれらすべてをroot
として実行します(最終的に希望するユーザーでそれを行う方法はありません)。
問題は次のとおりです。プロセスで作成されたものはすべて、rootまたはSudoユーザーが所有しています。完了したら(および途中で)、一連のchmod
およびchown
コマンドを発行して、物事を正しくする必要があります。
「これからは、rootとしてコマンドを発行したときに作成するファイルやディレクトリはすべて、そのような所有権とアクセス許可で作成する」とシステムに何らかの方法で伝えることができればいいでしょう。
スクリプトが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 supportsetuid
(chmod u+s
)と同じ動作ですが、Linuxでは動作しません。
別の方法がありますが、かなりエレガントだと思います。 install(1)の使用
たとえば、zabbix-agentdには/ var/run内にサブフォルダーが必要ですが、最近のディストリビューションでは/ var/runにtmpfsを使用しているため、ディレクトリは再起動後も存続しません。/etc/sysconfig/zabbix-agentdを含むファイルを作成して解決しました:
install -g zabbix -o zabbix -d /var/run/zabbix
Unixライクなシステムでは、新しく作成されたファイルとディレクトリは、それらを作成したプロセスの所有者が所有します。標準ユーティリティには通常、作成されたファイルの所有者を変更するオプションがありません。
一部のコマンドを繰り返し実行する場合は、変数_$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
_