Tengo un phpscript de shell ( ) que se pone en contacto con el archivo de destino de esta manera:
- inspecciona si los archivos y directorios se puede escribir con
php'sis_writable()(no creo que esto es un problema) - edita el archivo en el lugar con el
sedcomando:
grep -q "$search" "$passwd_file" && { sed -i "s|$search|$replace|" "$passwd_file"; printf "Password changed!\n"; } || printf "Password not changed!\n"
Como resultado obtengo (todo lo demás correcto pero) el archivo que debía myuser:www-dataser myuser:myuser.
¿ sedCambia la propiedad del grupo de archivos como parece, y cómo puedo evitarlo, si es posible?
bash
shell
shell-script
permissions
chown
Miloš Đakonović
fuente
fuente

Respuestas:
Hay un pequeño problema con
sedel modo de edición in situ-i.sedcrea un archivo temporal en el mismo directorio llamadosedy08qMA, dondey08qMAes una cadena generada aleatoriamente. Ese archivo se llena con el contenido modificado del archivo original. Después de la operación,sedelimina el archivo original y renombra el archivo temporal con el nombre del archivo original. Por lo tanto, no es una verdadera edición in situ . Crea un nuevo archivo con permisos del usuario llamante y un nuevo número de inodo. Ese comportamiento no es malo, pero por ejemplo, los enlaces duros se rompen.Sin embargo, si desea una verdadera edición in situ, debe usarla
ed. Lee los comandos del stdin y edita el archivo directamente, sin un archivo temporal (se realiza sobreedel búfer de memoria). Una práctica común es usarprintfpara generar la lista de comandos:El
printfcomando produce resultados de la siguiente manera:Esas dos líneas son
edcomandos. El primero busca la cadenasearchy la reemplaza porreplace. El segundo escribe (w) los cambios en el archivo y cierra (q).-ssuprime la salida de diagnóstico.fuente
El
-iparámetro desedfunciona creando un archivo temporal durante la operación, luego sobrescribe el archivo real con el archivo temporal al final. Esa es la causa más probable del problema, ya que al crear la propiedad del archivo temporal, el valor predeterminado esmyuser:myuserPuede establecer el
setgidbit en el directorio principal (solo si el directorio principal es propiedad del grupowww-data), de modo que los archivos creados en este directorio hereden el mismo grupo.Para hacer eso:
Creo que este es un uso muy típico de la
setgidbroca.fuente
sed -i, encontré la siguiente línea en la traza, ¿significa que creó el archivo temporal en el directorio actual?open("./sedKyG9Ei", O_RDWR|O_CREAT|O_EXCL, 0600) = 4El uso de en
edlugar desedparece bastante superfluo para esto, dado que tiene que canalizar una entrada adicional. La distribución en la que estoy trabajando en este momento (CentOS 5.10) tiene la-copción desedque utiliza 'copiar' el archivo temporal en lugar de simplemente renombrarlo cuando se usa con la-iopción. Lo probé y funcionó a la perfección, conservando el propietario y el grupo originales al hacer una edición en línea. NO conserva el tiempo de modificación.p.ej,
sed -ci -e '3,5d' file.txt-cutiliza la copia en lugar del cambio de nombre (es decir, conserva la propiedad / grupo)-iedición en línea-escript / expresión a ejecutarNo estoy seguro de cuán extendida está esta opción para
sedotras distribuciones. Solaris 10 no lo tenía, pero Solaris no tiene muchas cosas que quiero.fuente