Página 1 de 1

Fallo en función stat()

NotaPublicado: 2009-05-07 14:40 @653
por thedj
Muy buenas noches, estoy intentando comprobar si existe una shell en el sistema, y me ocurre un error que me ha dejado un poco tocado.

Código: Seleccionar todo
Unsuccesful stat on filename containing newline at ....


La línea de código del problema es la siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$rev="\."."$lineasrev[6]";
if(!(-d $rev)){#Linea del error
$error2=1;
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


$rev contiene bien lo que quiero comprobar (que no sé si lo que pretendo está bien elaborado). Pero el error que me sale no lo comprendo :? No veo nada mal en mi comprobación.

Muchas gracias por adelantado. :)

NotaPublicado: 2009-05-07 14:45 @656
por explorer
Pues creo que dice que el nombre de fichero que le estás pasando a stat() contiene un carácter de nueva línea.

Tendrás que quitarlo con chomp().

NotaPublicado: 2009-05-07 14:55 @663
por thedj
Estabas en lo cierto, muchas gracias, no me había dado cuenta que el último elemento del vector podía tener "\n", jejeje.

Pero creo que ese código no me hace el trabajo que necesito. ¿Como podría comprobar si existe una shell en el sistema?.

NotaPublicado: 2009-05-07 15:54 @704
por explorer
¿Y para qué necesitas una shell? ¿O el problema se reduce a saber si está o no está? ¿Qué tipo de shell (bash, csh, ksh, zoidberg, perlshell)?

NotaPublicado: 2009-05-07 16:07 @713
por thedj
El problema se reduce, a que nos dice que comprobemos si existe el directorio de casa del usuario y la shell, y nos va a meter una serie de archivos /etc/passwd ficticios para que comprobemos si existen, y algunas no existirán:

Por ejemplo una línea que comprueba que no existe seria: /bin/false2

Con el directorio de casa del usuario lo he realizado y me sale perfecto con if(-d directorio) pero la shell no tengo ni idea de cómo saber si existe.

Un cordial saludo.

NotaPublicado: 2009-05-07 16:29 @728
por explorer
Pues si -d es para directorios, -f es para ficheros. O -e si existe... etc.

Más información

NotaPublicado: 2009-05-07 16:34 @732
por thedj
Pero lo que tengo que comprobar ¿seria: ./bin/false2? y ¿seria un directorio?

Es que es tal como lo tengo puesto y no me reconoce ninguno (que se supone que están).

$lineasrev[6] contiene la shell de los usuarios(/bin/sh por ejemplo), y todos entran en el siguiente if:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$rev="\."."$lineasrev[6]";
if(!(-d $rev)){
$error2=1;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


(También he probado con -e)
Pienso que es más un problema de localización que de condición.

Un saludo.

NotaPublicado: 2009-05-07 16:46 @740
por explorer
Los shell de usuario, en /etc/passwd, son ficheros normales ejecutables.

Ojo, no es lo mismo ./bin/false2 que /bin/false2. Uno es relativo y el otro, absoluto. Si usas relativo, dependerá de donde estés ejecutando el programa.

NotaPublicado: 2009-05-07 16:56 @747
por thedj
Muchas gracias ya me funciona. Veo que quería yo complicarlo más de lo debido.

Un cordial saludo.