Tengo un script de bash cual se modifica el archivo como este

sed -i "/hello world/d" /etc/postfix/virtual

y me encontré con esta secuencia de comandos de la aplicación web. comando sed crear el archivo temporal en que el directorio, pero el usuario en virtud de la aplicación web funciona no tiene permisos para crear archivos en ese directorio. No quiero dar más permisos para el usuario a la carpeta. Es posible especificar temp ubicación del archivo de comando sed?

Soy nuevo en linux, así que lo siento si mi pregunta es muy fácil, pero yo no encuentro ninguna solución.

Gracias!

  • ¿Qué acerca de redirigir el archivo? sed "..." /etc/.../virtual > new_file A menos que usted realmente necesita para modificar en su lugar.
  • Tengo el mismo problema : me pongo en el grupo de raíz, y permisos » +x /etc/hosts, para ser capaz de secuencia de comandos de un cambio (con sed-i) en ella. Ha encontrado una solución ?
InformationsquelleAutor Radislav | 2013-11-22

5 Comentarios

  1. 5

    El archivo debe ser modificado a través de archivo temporal, esto es en realidad lo que sed estaba haciendo, pero que carecía de los permisos.

    Cuando se trata de una situación que acabamos de hacer este proceso manualmente.

    ## TEMP File
    TFILE=`mktemp --tmpdir tfile.XXXXX`
    trap "rm -f $TFILE" 0 1 2 3 15
    
    ##
    sed 's_XXX_YYY_' /etc/example > "$TFILE"
    cat "$TFILE" > /etc/example
    
    ## trap Deletes TFILE on Exit
    • Lo anterior funciona, porque puede configurar el archivo de configuración para permitir la edición, mientras que sigue teniendo el directorio protegido. En mi caso, me puse el grupo y los permisos de grupo para permitir que mi cuenta personal para editar el archivo, pero a la izquierda en todos los demás permisos sin cambios. El archivo temporal no está en el directorio, por lo que no se ve afectada, y el archivo de configuración de permiso de el gato al trabajo.
  2. 1

    Siempre se puede evitar la edición en línea:

    sed "/hello world/d" /etc/postfix/virtual > /tmp/_foo
    
    # mv /tmp/_foo /etc/postfix/virtual

    Pero permítanme advertir a un usuario de la web de edición de /etc/postfix/virtual es bastante arriesgada.

    • Pero supongo que al no tener permisos en /etc/posstfix, a continuación, el mv no será posible?
    • Ah tienes razón, entonces creo que lo OP que está tratando de no ir a trabajar.
  3. 1

    AFAIK, no se puede configurar sed para que.
    Así, usted tiene que ejecutar el comando con los privilegios necesarios.

    • crear un script llamado, por ejemplo, de la actualización de postfix (puede tener argumentos), y poner en /usr/local/bin

      #!/bin/bash
      sed -i "/$1/d" /etc/postfix/virtual
    • Crear un archivo en /etc/sudoers.d/(cualquiera que sea su nombre, se puede actualizar-postfix o algo más genérico), en sustitución de _user_ con el que llama al script :

      _user_ ALL = (root) NOPASSWD: /usr/local/bin/update-postfix

      Permite _user_ para ejecutar update-postfix (y sólo este comando como root

    • Su script, llamada sudo update-postfix helloworld en lugar del comando sed. La actualización-postfix secuencia de comandos se llama como el usuario root.

    NB : Llamado como tal, la secuencia de comandos (actualización-postfix) tiene derecho a hacer nada, así que cuidado con lo que se le ponga, y desinfectar los argumentos (lo que no hice aquí por razones de brevedad).

  4. 0

    Personalizado Simple archivo temporal de la solución, similar a la solución de @techzilla para aquellos que no quieran utilizar la trampa —

    sed  "/hello world/d" /etc/postfix/virtual > /tmp/temp_postfix_update && cat /tmp/temp_postfix_update > /etc/postfix/virtual && rm -f /tmp/temp_postfix_update

    Por qué @EdwinW dijo, la tubería de la entrada utilizando gato no eliminar el archivo a fin de que los permisos de escritura sobre el archivo persisten.

Dejar respuesta

Please enter your comment!
Please enter your name here