• Publicidad

Crear directorio

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Crear directorio

Notapor seafree » 2015-04-01 16:20 @722

Hola. Al momento de utilizar mkdir para crear un directorio me manda el mensaje de:

Permission denied

Sucede lo siguiente:

Creo una variable donde el directorio var/www/html/public_html/directorios/$inst/ existe. De manera dinámica creo el directorio con las variables $anio-$mes-$dia de acuerdo a una fecha seleccionada desde el HTML.

Así creo una variable $upload_dir con la siguiente ruta:
my $upload_dir = "/var/www/html/public_html/directorios/$inst/$anio-$mes-$dia";

Asigno los permisos 775 al directorio creado:
mkdir $upload_dir, 0775;

Lo anterior crea el directorio 11-02-01 de la siguiente manera:

dr-----r-t 2 apache apache 4096 Apr 1 12:10 11-02-02

¿Me pueden orientar, por favor, sobre cómo crear directorios desde Perl? Porque el directorio se está creando con menos permisos. Gracias.
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518

Publicidad

Re: Crear directorio

Notapor explorer » 2015-04-01 19:14 @843

mkdir no funciona así.

El segundo argumento a mkdir es una máscara de bits, que será modificada por el valor de umask actual del usuario.

Por ejemplo, si el valor de umask es 0022 (un valor normal), y el segundo argumento de mkdir lo ponemos a 0777 (que es, además, el valor por defecto para mkdir), el resultado será:

~0022 & 0777 = 0755

(ver la documentación de perldoc -f umask, más abajo)

Si obtienes unos permisos escasos, es muy probable que sea debido a que el umask del usuario que lo ejecuta sea muy restrictivo.

Puedes modificar el umask del usuario usando, naturalmente, la función umask() de Perl.

Entonces, se puede hacer algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. umask 0022;
  2. mkdir $carpeta; # El valor por defecto para mkdir es 0777. La carpeta se crea con permisos 0755
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Yo prefiero hacerlo de otra manera:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. mkdir $carpeta;
  2. chmod 0755, $carpeta;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero es más grave el mensaje de error: quiere decir que el usuario que está ejecutando el programa no tiene los suficientes privilegios para cambiar los permisos.

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
    mkdir ARCHIVO,MÁSCARA
    mkdir ARCHIVO
    mkdir   Crea el directorio especificado por el nombre de ARCHIVO, con
            permisos especificados por la MÁSCARA (y modificada por "umask").
            Si tiene éxito devuelve verdadero; en caso contrario devuelve
            falso y asigna $! (errno). MÁSCARA está puesto por defecto a 0777,
            si no se indica, y ARCHIVO es por defecto $_, si no se indica,
            también.

            En general, es mejor crear directorios con una MÁSCARA permisiva y
            dejar que el usuario lo modifique con su "umask" que suministrar
            una MÁSCARA restrictiva y no darle al usuario una forma de ser más
            permisivo. Las excepciones a esta regla son cuando el archivo o
            directorio debe mantenerse privados (archivos de correo, por
            ejemplo). La entrada perlfunc(1) sobre "umask" discute la elección
            de la máscara con más detalles.

            Tenga en cuenta que de acuerdo con POSIX 1.003.1-1996, el nombre
            de archivo puede tener cualquier número de barras diagonales.
            Algunos sistemas operativos y de sistemas de archivos no
            interpretan esto de forma correcta, por lo que Perl
            automáticamente elimina todas las barras diagonales finales para
            tener a todo el mundo feliz.

            Para, recursivamente, crear una estructura de directorios, mire la
            función "make_path" del módulo File::Path.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
    umask EXPR
    umask   Establece la umask para el proceso a EXPR y devuelve el valor
            anterior. Si EXPR se omite, simplemente devuelve la umask actual.

            Los permisos Unix "rwxr-x---" son representados como tres
            conjuntos de tres bits, o tres dígitos octales: 0750 (el 0
            precedente indica que es octal, y que no es uno de los dígitos).
            El valor de "umask" es un número que representa los bits de los
            permisos que quedan desactivados. El valor de permiso (o "modo")
            que se pasa a "mkdir" o "sysopen" son modificados por su "umask",
            así que incluso si usted le pide a "sysopen" crear un archivo con
            permisos 0777, y su "umask" es 0022, entonces el archivo realmente
            se crea con permisos 0755. Si su "umask" fuera 0027 (el grupo no
            puede escribir; los otros no pueden leer, escribir o ejecutar),
            entonces pasando a "sysopen" 0666 creará un archivo con el modo
            0640 (porque "0666 & ~027" es 0640).

            He aquí algunos consejos: suministre un modo de creación de 0666
            para archivos regulares (en "sysopen") y uno de 0777 para
            directorios (en "mkdir") y los archivos ejecutables. Esto ofrece a
            los usuarios la libertad de elección: si quieren archivos
            protegidos, podrían elegir un umask para el proceso de 022, 027,
            o incluso la máscara, particularmente antisocial, de 077. Los
            programas rara vez o nunca deben tomar decisiones políticas, que
            es mejor dejar al usuario. La excepción a esto es cuando se
            escriben archivos que deben mantenerse de forma privada: archivos
            de correo, los cookies del navegador web, archivos rhosts, y así
            sucesivamente.

            Si umask(2) no está implementada en su sistema y está tratando de
            restringir el acceso por sí mismo (es decir, "(EXPR & 0700) > 0"),
            se lanza una excepción. Si umask(2) no está implementado y usted
            no está tratando de restringir el acceso por sí mismo, devuelve
            "undef".

            Recuerde que un umask es un número, generalmente indicado en
            octal; no es una cadena de dígitos octales. Ver también "oct", si
            todo lo que tiene es una cadena.

            Cuestiones de portabilidad: "umask" in perlport.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Crear directorio

Notapor seafree » 2015-04-08 14:27 @644

Gracias por tu valioso apoyo, explorer.
seafree
Perlero nuevo
Perlero nuevo
 
Mensajes: 296
Registrado: 2012-08-10 11:26 @518


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados