Bashスクリプトでchownを実行するとエラーが発生します。

Bashスクリプトでchownを実行するとエラーが発生します。

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 ./filesudoパスワードの入力を求められ、barsudoパスワードがありません。

実行結果は次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この機能を持つプロセス)のみがファイル所有者を変更できます。ファイル所有者は、ファイルグループを所有者が属するグループに変更できます。権限のあるプロセス(Linux CAP_CHOWN:)は自由にグループを変更できます。

あなたのプロセスには権限がなく、所有するファイルグループを所有者グループに変更することもありません。

したがって、適切な権限を取得する必要があります。最も簡単な2つの方法は次のとおりです。

  1. ファイルの所有権を設定し(乱用を防ぐためにファイルのパス名をハードコーディングできると仮定します)、最小限のバイナリプログラム(おそらくCで)を作成し、それをrootに設定するか、より良い方法でCAP_CHOWN機能を追加します。sudo setcap cap_chown+ep <program_name>。プログラムはrootすべての結果で実行されます。

  2. /etc/sudoersパスワードなしで特定のコマンドを実行できるように、適切な項目を作成してくださいsudo。次の行を作成します。

    bar ALL = (root) NOPASSWD: /bin/chown foo:server '/full/path/to/file'
    

    適切なディレクティブがあることを確認/etc/sudoers.dしてください。ほとんどのLinuxディストリビューションには対応するディレクティブがあります。スクリプトが呼び出すコマンドが正確に一致していることを確認してください。/etc/sudoers#includedir

関連情報