[Perl] command line parameters geeft fout

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • alberthakvoort
  • Registratie: Juli 2006
  • Laatst online: 12:03
Ik wil onderstaand script aanpassen zodat ik de waardes ($send_message) via de commandline mee kan sturen. Het afvangen van de parameters met o.a. print Dumper \@ARGV; gaat goed, alleen kapt het script met de melding :
Uncaught exception from user code:
no socket at ./test.pl line 124.

Als ik het script zonder parameters start werkt het wel goed.

Na wat debuggen kom ik op perlsec/taint mode uit...Alleen is mijn Perl kennis (zeer) te beperkt om nu het probleem te tackelen... Wie kan mij in de goede richting wijzen?


Perl:
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
 
#!/usr/bin/perl 
# 
# read from velbus and writes to rrd
#

use strict;
use IO::Socket;
use POSIX qw/strftime/;
use lib qw(/usr/lib/perl5);
use POSIX qw/strftime/;

sub disp_data {
        my @dat_array = @_;
        my $data_count = 0;
        my $data_size = @dat_array;
        my $data_buf;

        for($data_count = 0;$data_count<$data_size;$data_count++){
            $data_buf = sprintf("%X ",$dat_array[$data_count]);
            print ("$data_buf");
        }
    }

sub calc_checksum {
        my @check_array = @_;
                my $check_return = 0;
        my $check_count;
        my $check_size = @check_array;

                for($check_count=0;$check_count<($check_size-1);$check_count++){
                        $check_return += $check_array[$check_count];
                }
                $check_return *= -1;
                $check_return = $check_return & 255;
        return $check_return;
    }

sub check_valid {
        my @check_array = @_;
                my $check_return = 0;
        my $check_size = @check_array;

                if (($check_array[0] eq 15) && ($check_array[$check_size-1] eq 4)){
                        if (calc_checksum(@check_array) eq $check_array[$check_size-2]){
                                $check_return = 1;
                        }
        }
        return $check_return;
        }

sub hex_to_ascii ($)
    {
        ## Convert each two-digit hex number back to an ASCII character.
        (my $str = shift) =~ s/([a-fA-F0-9]{2})/chr(hex $1)/eg;
        return $str;
    }

sub make_message {
        my @message = @_;
        my $return_message = "";
        my $make_lenght = @message;
        my @make_array = ();
        my @make_array2 = ();
        my $make_count;
        my $make_buffer;

        $make_array[0] = hex "0x0F";
        $make_array[1] = $message[0];
        $make_array[2] = $message[1];
        $make_array[3] = ($message[2] & 240) | (($make_lenght-3) & 15);
        
        for($make_count = 0;$make_count <= ($make_lenght-3);$make_count++){
            $make_array[$make_count+4] = $message[$make_count+3];
        }
        $make_buffer = calc_checksum(@make_array);
        $make_array[$make_lenght+1] = $make_buffer;
        $make_array[$make_lenght+2] = hex "0x04";

        $make_lenght = @make_array;
        @make_array2 = ();

        for($make_count=0;$make_count < $make_lenght;$make_count++){
                        $make_array2[$make_count] = chr($make_array[$make_count]);
                }

        $return_message = join('',@make_array2);
        return $return_message;
        }

### main
my @char_array = ();
my @data_array = ();
my $size;
my $count = 0;
my $hexad = 0;
my $recv_data;
my $check = 0;

my $send_addres;
my @send_message = ();
my $send_rtr;
my $send_prio;
my $ERROR;


my $host = shift || 'localhost';
my $port = shift || 3788;
my $sock = new IO::Socket::INET(
                   PeerAddr => $host,
                   PeerPort => $port,
                   Proto    => 'tcp');
$sock or die "no socket :$!";
$sock->autoflush(1);
    
    #send
    @send_message  = ();
    $send_addres     = hex "0x01";
        $send_prio       = hex "0xF8";
        $send_rtr        = hex "0x02";
    $send_message[0] = hex "0x02";
    $send_message[1] = hex "0x01";

    print $sock make_message($send_prio,$send_addres,$send_rtr,@send_message);


    close $sock;

Acties:
  • 0 Henk 'm!

  • Juup
  • Registratie: Februari 2000
  • Niet online
Er is nergens code die iets met @ARGV doet?
Laat eens exact de code zien die je runt, exact de aanroep en exact de errormelding.

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 08:57

Creepy

Tactical Espionage Splatterer

Perl:
1
2
my $host = shift || 'localhost';
my $port = shift || 3788;

Kijk hier eens goed naar........
Edit: jij ook Jaaap ;)

[ Voor 10% gewijzigd door Creepy op 29-10-2015 22:48 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Juup
  • Registratie: Februari 2000
  • Niet online
Oh ja dat kan natuurlijk ook.
Wat is daar fout aan dan?

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 13:35
't Lijkt me niet fout, maar je moet beseffen dat het script al twee argumenten accepteert, voor je probeert daar een andere betekenis aan te geven. ;)

Documentatie voor shift, voor de volledigheid. Merk op dat hier de variant buiten de scope van een subroutine van toepassing is.

Acties:
  • 0 Henk 'm!

  • alberthakvoort
  • Registratie: Juli 2006
  • Laatst online: 12:03
Soultaker schreef op vrijdag 30 oktober 2015 @ 00:14:
't Lijkt me niet fout, maar je moet beseffen dat het script al twee argumenten accepteert, voor je probeert daar een andere betekenis aan te geven. ;)

Documentatie voor shift, voor de volledigheid. Merk op dat hier de variant buiten de scope van een subroutine van toepassing is.
Komt er dus op neer dat de connectie waardes al in een array staan, en die schrijf ik weer over..

./test.pl 127.0.0.1 3788 01 02

werkt dus wel..

Maar ik snap nog niet helemaal wat de shift nu voor waarde heeft in dit script? De host en port waarde hoeft toch niet aangepast te worden?

------ edit

ik heb het gedeelte van de shift er uit gegooid en het adres+poort bij het Peer gedeelte ingevuld..

[ Voor 34% gewijzigd door alberthakvoort op 30-10-2015 11:59 ]

Pagina: 1