Thread Server-Verzeichnis überwachen (SSH) (15 answers)
Opened by DonKnilch at 2009-09-04 10:13

Linuxer
 2009-09-04 20:59
#125461 #125461
User since
2006-01-27
3882 Artikel
HausmeisterIn

user image
Hi,

ich habe mir das Net::SSH::Perl mal daheim installiert und getestet.
Ausserdem hab ich hier mehr Zeit zum Grübeln.

So, hier mal meine Erkenntnisse:

1.
Code: (dl )
my ( $var ) = $ssh->cmd('cd /dir') or die "";

Das muss zwangsläufig mit der Warnung enden, weil cmd() immer 3 Werte liefert, nämlich STDOUT, STDERR und EXITCODE. Das Kommando "cd /dir" wird erfolgreich ausgeführt und liefert einen Exitcode von 0.
Dieses wird ausgewertet und gilt als "FALSE" wodurch eben das "die ..." ausgeführt wird.

Beachte (welcher Wert in $var landet):
Code: (dl )
1
2
3
4
5
6
7
8
9
10
$ perl -le '
sub foo {
return qw( a b c );
}

my $var = foo();
print "Resultat: $var";
'
Resultat: c
$


Du solltest immer alle 3 Werte abfangen und auswerten!

2. In der Perldoc des Moduls ist nachzulesen, was bei cmd() so alles zu beachten ist. Z.B. dass u.U. zwei separate cmd()-Aufrufe in zwei separate Sessions ausgeführt werden und damit nichts miteinander zu tun haben!

Beispiel:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl
# vi:ts=4 sw=4 et:
use strict;
use warnings;
use Net::SSH::Perl;

my $ssh = Net::SSH::Perl->new( 'localhost' ) or die "ssh->new: $!";
$ssh->login();

# Achtung! zwei Kommandos in einem Aufruf!
my ( $out, $err, $exit ) = $ssh->cmd( 'cd /var/tmp; pwd' );
printf "Exitcode: %d\nOutput: %s\nError: %s\n--\n", $exit, $out || '', $err || '';

( $out, $err, $exit ) = $ssh->cmd( 'pwd' );
printf "Exitcode: %d\nOutput: %s\nError: %s\n--\n", $exit, $out || '', $err || '';
Resultat:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
$ perl5.10.0 /tmp/ssh.pl 
Exitcode: 0
Output: /var/tmp

Error:
--
Exitcode: 0
Output: /home/username

Error:
--


3. Du hast ein Skript erstellt, dass den relevanten Teil auf dem Remote-System erledigt und die Ausgabe auf STDOUT generiert (oder wie genau?). Warum weist Du diese Ausgabe nicht einfach einer Variable (s.o.) zu und verarbeitest diese?

4. Hast Du Dir die Doku überhaupt mal angeguckt?

5. Beachte bitte die Operatoren-Rangfolge beim open.
Entweder Du nutzt:
Code: (dl )
open( HANDLE, $filename_whatever ) || die "$!";

oder Du nutzt:
Code: (dl )
open HANDLE, $filename_whatever or "$!";

Beachte, wann die Klammern des open() geschrieben werden und wann nicht!


Greetz,
Linuxer

edit: Code-Beispiel(1.): Ausgabe von $var erweitert.
edit2: Code-Beispiel(2.): Ausgabe ueberarbeitet.
Last edited: 2009-09-04 21:20:45 +0200 (CEST)
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!

View full thread Server-Verzeichnis überwachen (SSH)