Saya memiliki php
skrip shell ( ) yang terhubung dengan file target dengan cara ini:
- memeriksa apakah file dan direktori yang dapat ditulis dengan
php
'sis_writable()
(Saya tidak berpikir bahwa ini adalah masalah) - melakukan edit file di tempat dengan
sed
perintah:
grep -q "$search" "$passwd_file" && { sed -i "s|$search|$replace|" "$passwd_file"; printf "Password changed!\n"; } || printf "Password not changed!\n"
Sebagai hasilnya saya mendapatkan (semuanya benar tetapi) file yang myuser:www-data
seharusnya myuser:myuser
.
Apakah ada sed
perubahan kepemilikan grup file, dan bagaimana saya menghindarinya, jika mungkin?
bash
shell
shell-script
permissions
chown
Miloš Đakonović
sumber
sumber
Jawaban:
Ada sedikit masalah dengan
sed
mode edit inplace-i
.sed
membuat file sementara di direktori yang sama yang disebutsedy08qMA
, di manay08qMA
string yang dihasilkan secara acak. File itu diisi dengan konten yang dimodifikasi dari file asli. Setelah operasi,sed
hapus file asli dan ganti nama file sementara dengan nama file asli. Jadi ini bukan suntingan inplace yang sebenarnya . Ini menciptakan file baru dengan izin dari pengguna panggilan dan nomor inode baru. Perilaku itu sebagian besar tidak buruk, tetapi misalnya, tautan keras rusak.Namun, jika Anda ingin mengedit inplace yang sebenarnya , Anda harus menggunakannya
ed
. Bunyinya perintah dari stdin dan mengedit file secara langsung, tanpa file sementara (itu dilakukan melaluied
buffer memori). Praktik umum adalah menggunakanprintf
untuk menghasilkan daftar perintah:The
printf
perintah menghasilkan output sebagai berikut:Kedua baris itu adalah
ed
perintah. Yang pertama mencari stringsearch
dan menggantinya denganreplace
. Yang kedua menulis (w
) perubahan ke file dan berhenti (q
).-s
menekan keluaran diagnostik.sumber
The
-i
parametersed
karya dengan membuat file temp selama operasi, kemudian menimpa file yang sebenarnya dengan temp file pada akhirnya. Itu kemungkinan besar penyebab masalah, karena ketika membuat kepemilikan temp file default kemyuser:myuser
Anda dapat mengatur
setgid
bit pada direktori induk (hanya jika direktori induk dimiliki oleh grupwww-data
), sehingga file yang dibuat di bawah direktori ini mewarisi grup yang sama.untuk melakukannya:
Saya pikir ini adalah penggunaan
setgid
bit yang sangat khas .sumber
sed -i
, menemukan baris berikut dalam penelusuran, apakah itu berarti ia membuat file temp di dir saat ini?open("./sedKyG9Ei", O_RDWR|O_CREAT|O_EXCL, 0600) = 4
Penggunaan
ed
bukannyased
agak berlebihan untuk ini, mengingat Anda harus memasukkan input tambahan. Distro yang sedang saya kerjakan sekarang (CentOS 5.10) memiliki-c
opsi untuksed
itu yang menggunakan 'penyalinan' file temp daripada hanya mengganti nama file itu ketika digunakan dengan-i
opsi. Saya telah mengujinya dan berfungsi dengan baik, menjaga pemilik dan grup asli saat melakukan pengeditan sisip. Ini TIDAK menghemat waktu modifikasi.misalnya,
sed -ci -e '3,5d' file.txt
-c
menggunakan salinan alih-alih mengganti nama (yaitu, mempertahankan kepemilikan / grup)-i
pengeditan sebaris-e
skrip / ekspresi yang akan dieksekusiTidak yakin seberapa luas pilihan ini untuk
sed
seluruh distro lain. Solaris 10 tidak memilikinya, tetapi Solaris tidak memiliki banyak hal yang saya inginkan.sumber