Tengo un php
script 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
sed
comando:
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-data
ser myuser:myuser
.
¿ sed
Cambia 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
sed
el modo de edición in situ-i
.sed
crea un archivo temporal en el mismo directorio llamadosedy08qMA
, dondey08qMA
es una cadena generada aleatoriamente. Ese archivo se llena con el contenido modificado del archivo original. Después de la operación,sed
elimina 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 sobreed
el búfer de memoria). Una práctica común es usarprintf
para generar la lista de comandos:El
printf
comando produce resultados de la siguiente manera:Esas dos líneas son
ed
comandos. El primero busca la cadenasearch
y la reemplaza porreplace
. El segundo escribe (w
) los cambios en el archivo y cierra (q
).-s
suprime la salida de diagnóstico.fuente
El
-i
parámetro desed
funciona 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:myuser
Puede establecer el
setgid
bit 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
setgid
broca.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) = 4
El uso de en
ed
lugar desed
parece 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-c
opción desed
que utiliza 'copiar' el archivo temporal en lugar de simplemente renombrarlo cuando se usa con la-i
opció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
-c
utiliza la copia en lugar del cambio de nombre (es decir, conserva la propiedad / grupo)-i
edición en línea-e
script / expresión a ejecutarNo estoy seguro de cuán extendida está esta opción para
sed
otras distribuciones. Solaris 10 no lo tenía, pero Solaris no tiene muchas cosas que quiero.fuente