• Publicidad

Ejecutar comandos del shell desde script CGI

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Ejecutar comandos del shell desde script CGI

Notapor zinwandago » 2007-04-28 05:55 @288

¿Se puede ejecutar algun comando del shell de Linux desde nuestro script CGI? Por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
exec cmd="mkdir -m 0755 /home/perico/directorio_nuevo";
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


¿Uso la función exec? ¿Cómo podría hacerse?
zinwandago
Perlero nuevo
Perlero nuevo
 
Mensajes: 35
Registrado: 2007-04-24 12:06 @545

Publicidad

Notapor explorer » 2007-04-28 06:39 @319

Por poder, se puede hacer, con la función system(), pero... si se trata de crear un directorio, puedes hacer que sea el propio Perl el que lo haga:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
mkdir '/home/perico/directorio_nuevo', 0755;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Si quieres ver ejemplos de mkdir(), system() y exec(), en este foro hay muchos. Usa el sistema de búsqueda.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor zinwandago » 2007-04-28 06:57 @331

Gracias mi Dios!!jejej
zinwandago
Perlero nuevo
Perlero nuevo
 
Mensajes: 35
Registrado: 2007-04-24 12:06 @545

Notapor zinwandago » 2007-04-28 07:11 @341

Introduciendo la linea:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
mkdir '/home/perico/directorio_nuevo', 0755;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

y ejecutando el perl,mediante:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
perl usuarios.cgi
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

me crea la carpeta, pero no consigo dar con la tecla. Lo que deseo es cuando un usuario se da de alta que también se cree su carpeta personal. Pero claro desde el navegador no me crea las carpetas, sólo lo hace cuando ejecuto Perl.

Por ejemplo, teniendo en cuenta vuestro código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
sub crear_nuevo_usuario{
      open my $file, '>>', $htpasswd or die ("No se pueede..");
      print {$file} join ":",$Input{'username'},crypth...;
      print {$file} "\n";
      close $file;
      #Aqui deseo crear una carpeta personal para ese nuevo usuario.
      mkdir '/home/perico/usuarios/'username'';
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Alguna sugerencia o ayuda.
zinwandago
Perlero nuevo
Perlero nuevo
 
Mensajes: 35
Registrado: 2007-04-24 12:06 @545

Notapor explorer » 2007-04-28 07:42 @362

Escríbelo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
mkdir "/home/perico/usuarios/$username", 0755
    or die "ERROR: No pude crear el directorio: $!\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y saldrá el porqué no ha podido hacerlo. Seguramente saldrá en los registros de actividad del servidor web o en el navegador si usas CGI::Carp qw(fatalsToBrowser);.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor zinwandago » 2007-04-28 10:49 @492

¿Cómo sería después para ver el tamaño de la carpeta de un usuario? ¿Cual es la instrucción de Linux?
Creo que es algo así como
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
du -hs /home../$username
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Y devuelve una línea, donde el primer campo es el tamaño. Podriamos obtener ese campo con un split, con delimitador de campo el espacio (/s).

¿Cuál sería la instrucción para que se ejecute desde el CGI? Por cierto, ya tengo solucionado para poder crear carpetas. Gracias, explorer.
zinwandago
Perlero nuevo
Perlero nuevo
 
Mensajes: 35
Registrado: 2007-04-24 12:06 @545

Notapor explorer » 2007-04-28 12:49 @576

En Perl se puede usar la función stat() para saber el tamaño de un fichero, pero pasa saber el tamaño de un directorio, habría que hacer una búsqueda recursiva por todo el árbol e ir mirando el tamaño de cada uno. A veces, sí, es mejor usar un comando externo o un módulo que nos de esa funcionalidad, como puede ser File::Size.

Para ejecutar un comando externo:
* usar la función system() del Perl
* el comando ha ejecutar está en el path del usuario que lo va a ejecutar o, en su defecto, poner el path completo dentro de system (/usr/bin/du)
* el comando ejecutado por el usuario tiene permisos sobre los ficheros en los que va a obtener información o les va a modificar.

El resultado es una línea, sí. Y para obtener el primer campo, hacer un split, pero en lugar de /s, mejor usar ' ' (ver el porqué en la doc de split).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor zinwandago » 2007-04-29 06:37 @317

Ya lo tengo casi conseguido; probando...e ilustrándome con las referencias de Explorer (la personificación de Perl,es broma...) obtengo ésto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

$nom = ejemplo;

mkdir  "/home/perico/perl/$nom", 0777 or die "ERROR99:No puede crear directorio:$!\n";
@tam = system("du -hs /home/perico/perl/$nom");
print "Tamanio de la carpeta es: ",@tam,"\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Me crea la carpeta donde y con el nombre que quiero. Si está ya creada nos da error.
Con la llamada al comando de system(), da una línea con el tamaño de la carpeta total, es decir:

4,0K /home/perico/perl/ejemplo

Pero yo intento quedarme con el dato que me interesa, es decir, los 4,0K; empiezo obteniendo el resultado pero solo me devuelve 0 (ejecución correcta del comando system). ¿Cómo hago para que la salida del comando system la pueda almacenar en una variable en perl, después haría un split con delimitador de campo el espacio y así obtendría solo el tamaño? ¿Pero no consigo pasar la información que nos da la orden system(du...) a una variable?

Si me habéis entendido cómo lo solucionaría. Gracias de antemano. Un saludo
zinwandago
Perlero nuevo
Perlero nuevo
 
Mensajes: 35
Registrado: 2007-04-24 12:06 @545

Notapor explorer » 2007-04-29 06:54 @329

Según la documentación de system(), esta función no devuelve la salida del comando ejecutado, sino el código del estado de salida del comando. Si quieres capturar la salida de la ejecución, necesitas usar las backticks (`) o qx().
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor zinwandago » 2007-04-29 07:00 @333

Entonces seria simplemente poner:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

$nom = ejemplo;

mkdir  "/home/perico/perl/$nom", 0777 or die "ERROR99:No puede crear directorio:$!\n";
$tam = `du -hs /home/perico/perl/$nom`;  #Sin poner system
print "Tamanio de la carpeta es: ",$tam,"\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

¿Funcionaría?
zinwandago
Perlero nuevo
Perlero nuevo
 
Mensajes: 35
Registrado: 2007-04-24 12:06 @545

Siguiente

Volver a Básico

¿Quién está conectado?

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