Schrift
[thread]7967[/thread]

[Linux] ext. Prog. starten und Daten einlesen



<< |< 1 2 >| >> 12 Einträge, 2 Seiten
Gast Gast
 2006-05-11 13:08
#65949 #65949
Hallo!

Ich würde gerne unter Linux ein externes Prog (ifconfig) in einem Perl Script starten und die ausgabe von ifconfig einlesen und in Perl weiterverarbeiten.

Wie mach ich das?

Gruß!

-Benny-
betterworld
 2006-05-11 13:20
#65950 #65950
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
perldoc -f readpipe
Linuxer
 2006-05-11 13:22
#65951 #65951
User since
2006-01-27
3870 Artikel
HausmeisterIn

user image
Benutze Backticks:

Code (perl): (dl )
1
2
# Ausgabe landet in $output; Fehlerkanal wird auch auf STDOUT ausgegeben (2>&1)
my $output = `/sbin/ifconfig -a 2>&1`;


http://perldoc.perl.org/perlop.html#%60STRING%60

[edit]hm, readpipe kannte ich noch nicht ....[/edit]\n\n

<!--EDIT|Linuxer|1147343499-->
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
-Benny-
 2006-05-12 12:23
#65952 #65952
User since
2006-05-11
2 Artikel
BenutzerIn
[default_avatar]
Hallo!

Erstmal danke für die Tips...
...leider kapier ich das nich so ganz.
Könntet ihr mir vielleicht ein Beispiel geben? Wäre sehr nett:-)

Ich würde gerne die Ausgabe von ifconfig zeilenweise in ein Array leiten.

Danke schonmal!


Gruß!
Benjamin\n\n

<!--EDIT|-Benny-|1147422228-->
vayu
 2006-05-12 12:45
#65953 #65953
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
      1 #!/usr/bin/perl
      2 
      3 use strict;
      4 use warnings;
      5 
      6 my @output = qx(/sbin/ifconfig -a 2>&1);
      7 foreach(@output) {
      8     print $_;
      9 }


waren backticks nicht "veraltet"? :D\n\n

<!--EDIT|vayu|1147423684-->
pq
 2006-05-12 12:46
#65954 #65954
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
my @lines = qx(/pfad/zu/ifconfig);
perldoc -f qx
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
-Benny-
 2006-05-12 12:52
#65955 #65955
User since
2006-05-11
2 Artikel
BenutzerIn
[default_avatar]
@all

Vielen, vielen dank :)
bloonix
 2006-05-12 15:35
#65956 #65956
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hallo Benny,

um welche Informationen geht es dir denn genau?

Du kannst auch mal einen Blick in

CPAN:Linux::net::dev
CPAN:Linux::Statistics

werfen, allgemein aber

CPAN:Linux::*

Da gibt es viele nette Lösungen.

Viele Grüße,
opi\n\n

<!--EDIT|opi|1147433869-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
bloonix
 2006-05-12 16:04
#65957 #65957
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=vayu,12.05.2006, 10:45]
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
      1 #!/usr/bin/perl
      2 
      3 use strict;
      4 use warnings;
      5 
      6 my @output = qx(/sbin/ifconfig -a 2>&1);
      7 foreach(@output) {
      8     print $_;
      9 }


waren backticks nicht "veraltet"? :D[/quote]
Nun, ich finde die Verwendung von qx viel zu unsicher, um externe
Programme aufzurufen. Viel sicherer wäre es, wenn man mit waitpid etc.
arbeiten würde...

Code: (dl )
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
use strict;
use warnings;
use IPC::Open3;

my @errors;
my $command = '/sbin/ifconfig -a';
my $pid = open3(\*CHLD_STDIN, \*CHLD_STDOUT, \*CHLD_STDERR, $command) or die "Fehler: $command kann nicht ausgefuehrt werden - $!";

# CHLD_IN wird geschlossen, da wir die Optionen schon mitgegeben haben.
# Nach dem close von CHLD_IN faengt ifconfig an zu arbeiten...
close CHLD_STDIN;

# es wird STDOUT des Prozesses ausgelesen und verarbeitet
while (<CHLD_STDOUT>) {
  # irgendeine Verarbeitung
  print;
}

close CHLD_STDOUT;

# Mit $/ wird der gesamte Inhalt von CHLD_STDERR auf einmal
# eingelesen. Das ganze in einem extra Block, damit $/ nicht
# global veraendert wird.

{
  local $/;
  @errors = <CHLD_STDERR>;
}

close CHLD_STDERR;

# Prozess wieder einsammeln.
waitpid($pid,0);

# Ausgabe des Status.
printf "Status: %i\n", ($? ? $? / 256 : $?);

if (@errors) {
  print "Aufgetretene Fehler:\n";
  print for @errors;
}


Perldoc:IPC::Open3

greez,
opi\n\n

<!--EDIT|opi|1147486539-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
Strat
 2006-05-12 16:12
#65958 #65958
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=vayu,12.05.2006, 10:45]waren backticks nicht "veraltet"? :D[/quote]
eigentlich ja
eigentlich nein

in 90% der faelle halte ich system oder pipe-open fuer die bessere loesung, aber manchmal reichen auch backticks.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2006-05-11 13:08.