インプレース編集でSEDがファイルのグループ所有権を変更する


8

phpこの方法でターゲットファイルにアクセスするシェル()スクリプトがあります。

  • ファイルとディレクトリが書き込み可能であるかどうかを検査phpさんis_writable()(私はこれが問題であるとは思いません)
  • sed次のコマンドでインプレースファイル編集を行います。

grep -q "$search" "$passwd_file" && { sed -i "s|$search|$replace|" "$passwd_file"; printf "Password changed!\n"; } || printf "Password not changed!\n"

結果として、私は(他のすべては正しいが)あるmyuser:www-dataはずのファイルを取得しますmyuser:myuser

sedファイルグループの所有権は変更されているように見えますか。また、可能であればそれを回避するにはどうすればよいですか。


回答:


16

sedのインプレース編集モードには少し問題があります-ised呼ばれる同じディレクトリに一時ファイルを作成しsedy08qMAy08qMAランダムに生成された文字列です。そのファイルは、元のファイルの変更された内容で埋められます。操作後、sed元のファイルを削除し、一時ファイルの名前を元のファイル名に変更します。そのため、本当のインプレイス編集ではありません。呼び出し元ユーザーのアクセス許可と新しいiノード番号を含む新しいファイルを作成します。その振る舞いはほとんど悪くはありませんが、例えば、ハードリンクは壊れます。

ただし、真のインプレース編集が必要な場合は、を使用する必要がありますed。これは、stdinからコマンドを読み取り、一時ファイルなしでファイルを直接編集します(これはのedメモリバッファー上で行われます)。一般的な方法は、を使用printfしてコマンドリストを生成することです。

printf "%s\n" '1,$s/search/replace/g' wq | ed -s file

このprintfコマンドは、次のような出力を生成します。

1,$s/search/replace/g
wq

これらの2行はedコマンドです。最初のものは文字列searchを検索し、それをに置き換えreplaceます。2つ目wは変更をファイルに書き込み()、終了します(q)。-s診断出力を抑制します。


8

-iパラメータは、sed動作中に一時ファイルを作成することで機能し、最後に実際のファイルを一時ファイルで上書きします。これが問題の原因である可能性が最も高いです。一時ファイルの所有権を作成すると、デフォルトでmyuser:myuser

setgid親ディレクトリにビットを設定して(親ディレクトリがgroupによって所有されている場合のみwww-data)、このディレクトリの下に作成されたファイルが同じグループを継承するようにすることができます。
それを行うには:

chmod g+s parent-dir-of-your-file  

これは非常に典型的なsetgidビットの使い方だと思います。


@cuonglm私はstraceを実行しsed -iましたが、トレースで次の行を見つけました、それは現在のディレクトリに一時ファイルを作成したことを意味しますか?open("./sedKyG9Ei", O_RDWR|O_CREAT|O_EXCL, 0600) = 4
Dave.d

@DavidDai:はい、私の記憶が間違っています。
cuonglm

2

ed代わりにを使用することはsed、追加の入力をパイプ処理する必要があることを考えると、かなり不必要に思えます。私が現在取り組んでいるディストリビューション(CentOS 5.10)には、一時ファイルの「コピー」を利用する-cオプションがあり、オプションでsed使用するときに名前を変更するだけではありません-i。私はそれをテストしましたが、インライン編集を行うときに元の所有者とグループを維持しながら、完全に機能しました。変更時間は保持されません。

例えば、 sed -ci -e '3,5d' file.txt

  • -c 名前変更の代わりにコピーを使用します(つまり、所有権/グループを保持します)
  • -i インライン編集
  • -e 実行するスクリプト/式

このオプションがsed他のディストリビューション全体にどれだけ普及しているかはわかりません。Solaris 10にはありませんでしたが、Solarisには欲しいものがたくさんありません。


かなり便利に聞こえます。Ubuntu 14.04ではありませんが、FWIW。:-(
John Rix
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.