
何かを行う必要があり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