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
?可能であれば、これを防ぐ方法は何ですか?
ベストアンサー1
sed
内部編集モードに小さな問題があります-i
。内部にランダムに生成された文字列を含むsed
同じディレクトリに名前が付けられた一時ファイルを作成します。このファイルは元のファイルの変更内容で埋められます。操作が完了したら、元のファイルを削除し、一時ファイル名を元のファイル名に変更します。だからそれは本当ではありません。sedy08qMA
y08qMA
sed
所定の位置で編集。呼び出すユーザーの権限と新しい 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
診断出力を抑制します。