Perl - convertir bash a perl

 
Vista:
sin imagen de perfil
Val: 11
Ha mantenido su posición en Perl (en relación al último mes)
Gráfica de Perl

convertir bash a perl

Publicado por pirulo6666666 (5 intervenciones) el 07/10/2018 14:51:28
Estoy intentando pasar un script bash a perl y a pesar de mirar muchos ejemplos no doy con esto.
Parte de mi bash es este:
1
2
3
4
if echo "$loginResult" | grep -q "/clientarea.php?incorrect=true"; then
    echo "Login failed." 1>&2
    exit 1
fi

Esto es lo que modifique para Perl:
1
2
3
if (print $loginResult | grep (-q "/clientarea.php?incorrect) == true") {
    print "Login failed.";
    exit 1;}

Les agradesco cualquier ayuda.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Joaquin
Val: 56
Oro
Ha mantenido su posición en Perl (en relación al último mes)
Gráfica de Perl

convertir bash a perl

Publicado por Joaquin (31 intervenciones) el 07/10/2018 21:28:27
Debería ser algo así:

1
2
3
4
if (grep { "/clientarea.php?incorrect=true" } $loginResult) {
    print "Login failed.\n";
    exit 1;
}

grep() es una función de Perl que tiene dos argumentos: la expresión a evaluar y una lista de elementos a probar. El resultado es la lista de los elementos que cumplen la condición. Con que haya un solo elemento, y sea distinto de nulo, pues devuelve verdadero al if().
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 11
Ha mantenido su posición en Perl (en relación al último mes)
Gráfica de Perl

convertir bash a perl

Publicado por Reno (5 intervenciones) el 07/10/2018 21:59:33
Gracias Joaquin, es la primera vez que intento hacer algo en Perl y estaba perdido.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 11
Ha mantenido su posición en Perl (en relación al último mes)
Gráfica de Perl

convertir bash a perl

Publicado por Reno (5 intervenciones) el 13/10/2018 14:23:22
Despues de convertir todo a Perl me encuentro con el problema de que no hace Login a la pagina y creo que es por el temporal mktemp que no se usarlo.Comente el checkeo de las IP para que se ejecute hasta el final.Gracias de antemano por la ayuda.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/usr/bin/perl
 
use Socket;
use strict;
use warnings;
use File::Temp;
# settings
# Login information of freenom.com
my $freenom_email='miemail@yahoo.es';
my $freenom_passwd="mi password";
 
# Open DNS management page in your browser.
# URL vs settings:
#   https://my.freenom.com/clientarea.php?managedns={freenom_domain_name}&domainid={freenom_domain_id}
my $freenom_domain_name="midominio.com";
my $freenom_domain_id="1000000000";
my $BASE_URL="https://my.freenom.com";
my $CAREA_URL="$BASE_URL/clientarea.php";
my $LOGIN_URL="$BASE_URL/dologin.php";
my $LOGOUT_URL="$BASE_URL/logout.php";
my $MANAGED_URL="$CAREA_URL?managedns=$freenom_domain_name&domainid=$freenom_domain_id";
my $IP_domain_name="midominio.ISP.es";
 
my $current_ip = inet_ntoa(scalar gethostbyname(my $host || $IP_domain_name));
print "current ip: $current_ip\n";
my $server_ip = inet_ntoa(scalar gethostbyname( $host || $freenom_domain_name ));
print "server ip: $server_ip\n";
if ($current_ip) {
	#tiene algun valor
}else {
	print"No se puede obtener Current IP\n";
	exit 1;}
#if ($current_ip eq $server_ip){
#	print "Las IP coinciden\n";
#	exit 0;
#}else{
#	
#	print "se actualizaran las DNS\n";
#	exit 1;}
my $cookie_file = mktemp("temporalXXXX");
sub cleanup() {
    print "Cleanup \n";
    unlink $cookie_file;
}
$SIG{INT} = cleanup();
 
my $loginResult='curl --compressed -k -L -c "$cookie_file" \
                   -F "username=$freenom_email" -F "password=$freenom_passwd" \
                   -e "$CAREA_URL" \
                   "$LOGIN_URL" 2>&1';
 
#esto falla
if ( ! -s $cookie_file ) {
    print "Login failed: empty cookie. \n";
    exit 1;}
 
if (grep { "/clientarea.php?incorrect=true" } $loginResult) {
    print "Login failed.\n";
    exit 1; }
 
print "Update $current_ip to domain($freenom_domain_name)";
my $updateResult='curl --compressed -k -L -b "$cookie_file" \
                    -e "$MANAGED_URL" \
                    -F "dnsaction=modify" \
                    -F "records[0][line]=" \
                    -F "records[0][type]=A" \
                    -F "records[0][name]=$freenom_domain_name" \
                    -F "records[0][ttl]=7200" \
                    -F "records[0][value]=$current_ip" \
                    -F "records[1][line]=" \
                    -F "records[1][type]=A" \
                    -F "records[1][name]=www.$freenom_domain_name" \
                    -F "records[1][ttl]=7200" \
                    -F "records[1][value]=$current_ip" \
                    "$MANAGED_URL" 2>&1';
 
if (! grep {"name=\"records\[0\]\[value\]\" value=\"$current_ip\""} $updateResult){
    print "Update failed.\n";
    exit 1;}
 
print "Logout\n";
my $salida='curl --compressed -k -b "$cookie_file" "$LOGOUT_URL" > /dev/null 2>&1';
 
exit 0;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Joaquin
Val: 56
Oro
Ha mantenido su posición en Perl (en relación al último mes)
Gráfica de Perl

convertir bash a perl

Publicado por Joaquin (31 intervenciones) el 13/10/2018 14:53:17
El problema está en líneas como esta:

1
2
3
4
my $loginResult='curl --compressed -k -L -c "$cookie_file" \
-F "username=$freenom_email" -F "password=$freenom_passwd" \
-e "$CAREA_URL" \
"$LOGIN_URL" 2>&1';

Al poner la cadena de caracteres rodeada por comillas simples, no se realiza la expansión de las variables escalares. La cadena sale tal cual se ha escrito.

Lo más sencillo es ponerlo en una sola línea y usar el operador qq(), que realiza la misma operación que las comillas dobles.

my $loginResult = qq(curl --compressed -k -L -c "$cookie_file" -F "username=$freenom_email" -F "password=$freenom_passwd" -e "$CAREA_URL" "$LOGIN_URL" 2>&1);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 11
Ha mantenido su posición en Perl (en relación al último mes)
Gráfica de Perl

convertir bash a perl

Publicado por Reno (5 intervenciones) el 13/10/2018 15:15:50
LO hice tal cual me decis y me da el mismo error: Login failed: empty cookie.
Alguna idea?
Te agradesco las molestias.

El codigo en Bash funciona.
En bash es este:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
BASE_URL="https://my.freenom.com"
CAREA_URL="$BASE_URL/clientarea.php"
LOGIN_URL="$BASE_URL/dologin.php"
LOGOUT_URL="$BASE_URL/logout.php"
MANAGED_URL="$CAREA_URL?managedns=$freenom_domain_name&domainid=$freenom_domain_id"
#GET_IP_URL="https://api.ipify.org/"
 
perl  <<'__HERE__'
use Socket;
use strict;
use warnings;
our $current_ip = inet_ntoa(scalar gethostbyname(my $host || 'midominio.ISP.es' ));
print "current ip: $current_ip\n";
our $server_ip = inet_ntoa(scalar gethostbyname( $host || 'midominio.com' ));
print "server ip: $server_ip\n";
if ($current_ip eq $server_ip){
	print "Las IP coinciden\n";
	exit 0;
}else{
	print "se actulizaran las DNS";
	exit 1;}
bash echo "print mi ip $current_ip"
__HERE__
 
if [ $? = "0" ]; then
	exit 0
fi
 
# get current ip address
current_ip="$(curl -s ifconfig.me/ip)"
#salidaip="$(perl -e inet_ntoa(scalar gethostbyname(my $host || 'midominio.ISP.es' ))"
#echo "$salidaip"
#server_ip="$(host -t a $freenom_domain_name | sed 's/.*has address //')"
#server_ip="$(dig +short reno.gq @ns01.freenom.com)"
#echo "server  ip:" $server_ip
echo "current ip:" $current_ip
 
if [ -z "$current_ip" ]; then
    echo "Could not get current IP address." 1>&2
    exit 1
fi
 
cookie_file=$(mktemp)
#Para prueba
#echo "sale por aca"
#exit 0
 
cleanup() {
    echo "Cleanup"
    rm -f "$cookie_file"
}
trap cleanup INT EXIT TERM
 
echo "Login"
loginResult=$(curl --compressed -k -L -c "$cookie_file" \
                   -F "username=$freenom_email" -F "password=$freenom_passwd" \
                   -e "$CAREA_URL" \
                   "$LOGIN_URL" 2>&1)
 
if [ ! -s "$cookie_file" ]; then
    echo "Login failed: empty cookie." 1>&2
    exit 1
fi
 
if echo "$loginResult" | grep -q "/clientarea.php?incorrect=true"; then
    echo "Login failed." 1>&2
    exit 1
fi
 
echo "Update $current_ip to domain($freenom_domain_name)"
updateResult=$(curl --compressed -k -L -b "$cookie_file" \
                    -e "$MANAGED_URL" \
                    -F "dnsaction=modify" \
                    -F "records[0][line]=" \
                    -F "records[0][type]=A" \
                    -F "records[0][name]=$freenom_domain_name" \
                    -F "records[0][ttl]=7200" \
                    -F "records[0][value]=$current_ip" \
		    -F "records[1][line]=" \
                    -F "records[1][type]=A" \
                    -F "records[1][name]=www.$freenom_domain_name" \
                    -F "records[1][ttl]=7200" \
                    -F "records[1][value]=$current_ip" \
                    "$MANAGED_URL" 2>&1)
 
if ! echo "$updateResult" | grep -q "name=\"records\[0\]\[value\]\" value=\"$current_ip\""; then
    echo "Update failed." 1>&2
    exit 1
fi
 
echo "Logout"
curl --compressed -k -b "$cookie_file" "$LOGOUT_URL" > /dev/null 2>&1
 
exit 0
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Joaquin
Val: 56
Oro
Ha mantenido su posición en Perl (en relación al último mes)
Gráfica de Perl

convertir bash a perl

Publicado por Joaquin (31 intervenciones) el 13/10/2018 17:59:19
El error viene de haber confundido las comillas de entrecomillado simple (') con las comillas inversas de ejecución de código (`).

Entonces, en la línea

my $loginResult = qq(curl --compressed -k -L -c "$cookie_file" -F "username=$freenom_email" -F "password=$freenom_passwd" -e "$CAREA_URL" "$LOGIN_URL" 2>&1);

estamos guardando una cadena de caracteres, pero no la estamos ejecutando.

Cambia qq() por qx(), así:

my $loginResult = qx(curl --compressed -k -L -c "$cookie_file" -F "username=$freenom_email" -F "password=$freenom_passwd" -e "$CAREA_URL" "$LOGIN_URL" 2>&1);

qx() tiene el mismo efecto que las comillas inversas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 11
Ha mantenido su posición en Perl (en relación al último mes)
Gráfica de Perl

convertir bash a perl

Publicado por Reno (5 intervenciones) el 13/10/2018 19:38:18
Ahora paso el primer if sin problema pero en este codigo dio Login failed.

if (grep { "/clientarea.php?incorrect=true" } $loginResult) {
print "Login failed.\n $regrep\n";
exit 1; }

Lo comprobe con imprimiendo el resultado de $var1=grep( { "/clientarea.php?incorrect=true" } $loginResult); y me da 1

Esta con qx

my $loginResult=qx(curl --compressed -k -L -c "$cookie_file" -F "username=$freenom_email" -F "password=$freenom_passwd" -e "$CAREA_URL" "$LOGIN_URL" 2>&1);

Joaquin, lamento que te estoy dando la lata con esto, pero creo que es la ultima que falla porque comente el codigo que da error y sigue sin dar errores hasta el final aunque no haga nada
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Joaquin
Val: 56
Oro
Ha mantenido su posición en Perl (en relación al último mes)
Gráfica de Perl

convertir bash a perl

Publicado por Joaquin (31 intervenciones) el 14/10/2018 02:31:18
El '1' indica que grep{} sí que ha encontrado la cadena de caracteres dentro de $LoginResult, así que el servidor ha devuelto incorrect=true

Eso quiere decir, creo, que la petición no ha sido la misma que desde Bash.

Intenta comparar la cadena de curl con todos los argumentos, tanto en Bash como en Perl, porque debe haber alguna diferencia.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar