bar:bar
所有権を持つファイルをダウンロードしてから所有権をに変更するスクリプトを作成していますfoo:server
。だからそれを通過するために補助スクリプト(chown_test.sh
)を書いたchown
。これがうまくいくと、これはデフォルトのスクリプトに挿入されますが、問題が発生します(下に表示されます)、おそらく使用量が不足しているからですchown
。
メモ:以下に必要な情報をすべて掲載しようとしましたが、より多くの情報が必要な場合はコメントでお知らせください。
ディレクトリ構造、所有権および権限:
+ drwxrwxr-x 2 foo:server chown_test # test directory
├─ -rwxrwxr-- 1 foo:server chown_test.sh # side script
├─ -rwxrwxr-- 1 bar:bar file # empty file
関連項目/etc/group
:
sudo:x:27:foo
bar:x:33:foo
foo:x:1000:
server:x:1003:bar,foo
コードchown_test.sh
:
#!/bin/bash
echo "User: $USER"
chown foo:server ./file
私も試してみましたが、sudo chown foo:server ./file
sudoパスワードの入力を求められ、bar
sudoパスワードがありません。
実行結果は次chown_test.sh
のとおりですbar
。
[16:13 foo@Opus]:~/chown_test$ sudo -H -u bar bash -c ./chown_test.sh
User: bar
chown: changing ownership of ‘./file’: Operation not permitted
実行結果は次chown_test.sh
のとおりですfoo
。
[16:14 foo@Opus]:~/chown_test$ ./chown_test.sh
User: foo
chown: changing ownership of ‘./file’: Operation not permitted
誰かが私のジレンマを説明できますか?
私の質問を読んでくれてありがとう。
修正する:
助けを借りてToby Speightの回答とコメント、幸せなメディアを見つけました。
から、「権限のあるプロセス(Linux:CAP_CHOWN
この機能を持つプロセス)のみがファイル所有者を変更できます。ファイル所有者は、ファイルグループを所有者が属する任意のグループに変更できます。」その後、所有者以外のグループのみを変更することにしました。
chown
私はコマンドをchown_test.sh
次のように変更してこれを実行しました。
chown :server ./file
結果:
├─ -rwxrwxr-- 1 bar:server file
私には効果がありますが、あなたにはそうでない場合は、一度見てくださいトビースペートの回答詳しくは下記をご覧ください。
答え1
chown(2)
マニュアルページから:
権限のあるプロセス(Linux:
CAP_CHOWN
この機能を持つプロセス)のみがファイル所有者を変更できます。ファイル所有者は、ファイルグループを所有者が属するグループに変更できます。権限のあるプロセス(LinuxCAP_CHOWN
:)は自由にグループを変更できます。
あなたのプロセスには権限がなく、所有するファイルグループを所有者グループに変更することもありません。
したがって、適切な権限を取得する必要があります。最も簡単な2つの方法は次のとおりです。
ファイルの所有権を設定し(乱用を防ぐためにファイルのパス名をハードコーディングできると仮定します)、最小限のバイナリプログラム(おそらくCで)を作成し、それをrootに設定するか、より良い方法で
CAP_CHOWN
機能を追加します。sudo setcap cap_chown+ep <program_name>
。プログラムはroot
すべての結果で実行されます。/etc/sudoers
パスワードなしで特定のコマンドを実行できるように、適切な項目を作成してくださいsudo
。次の行を作成します。bar ALL = (root) NOPASSWD: /bin/chown foo:server '/full/path/to/file'
適切なディレクティブがあることを確認
/etc/sudoers.d
してください。ほとんどのLinuxディストリビューションには対応するディレクティブがあります。スクリプトが呼び出すコマンドが正確に一致していることを確認してください。/etc/sudoers
#includedir