ファイルのグループ所有権を変更する内部編集機能を備えたSed

ファイルのグループ所有権を変更する内部編集機能を備えたSed

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

  • ファイルとディレクトリが書き込み可能であることを確認してくださいphpis_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-datamyuser:myuser

ファイルグループの所有権が変更されますかsed?可能であれば、これを防ぐ方法は何ですか?

答え1

sed内部編集モードに小さな問題があります-i。内部にランダムに生成された文字列を含むsed同じディレクトリに名前が付けられた一時ファイルを作成します。このファイルは元のファイルの変更内容で埋められます。操作が完了したら、元のファイルを削除し、一時ファイル名を元のファイル名に変更します。だからそれは本当ではありません。sedy08qMAy08qMAsed所定の位置で編集。呼び出すユーザーの権限と新しい inode 番号を使用して新しいファイルを生成します。この動作は主に良いですが、たとえばハードリンクが壊れています。

しかし、望むなら本物内部編集には使用する必要がありますed。一時ファイルなしで標準入力からコマンドを読み取り、ファイルを直接編集します(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診断出力を抑制します。

答え2

-isedパラメータは、実行時に一時ファイルを生成し、最終的にその一時ファイルで物理ファイルを上書きするように機能します。一時ファイルの所有権がデフォルト値に設定されているため、これが問題の原因である可能性が高くなります。myuser:myuser

親ディレクトリにこのビットを設定するとsetgid(親ディレクトリがグループに属する場合のみwww-data)、このディレクトリの下に作成されたファイルは同じグループを継承します。
これを行うことができる必要があります。

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

私はこれがsetgidドリルビットの非常に一般的な用途だと思います。

答え3

追加の入力をパイプする必要があることを考慮すると、代わりに使用するのが重複してedいるようです。sed現在開発中のディストリビューション(CentOS 5.10)には、そのオプションと一緒に使用するときに名前を変更するのではなく、一時ファイル「コピー」を利用する-cオプションがあります。これをテストしてみると、インラインで編集するときに元の所有者とグループが維持され、うまく機能します。修正時間を保存しません。sed-i

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

  • -c名前を変更する代わりにコピーを使用してください(所有権/グループの保持など)。
  • -iインライン編集
  • -e実行するスクリプト/表現式

sedこのオプションが他のディストリビューションでどのように一般的であるかはわかりません。 Solaris 10にはそのような機能はありませんが、Solarisには私が望むものはあまりありません。

答え4

頑張りましたhttps://crates.io/crates/sd文字列だけを交換しても大丈夫です。フラグは変更されません。

これをインストールするには、Rustをインストールしてから「cargo install sd」をインストールする必要があります。

現在、Rustは以下のように多くのユースケースでC / C ++の実行可能な代替言語です。時々、より良い選択肢を得るためにインストールを後悔しないでしょう。

関連情報