Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]11015[/thread]

Ausgabedaten von net:ssh:perl command

Leser: 1


<< >> 10 Einträge, 1 Seite
Gast Gast
 2007-12-13 12:45
#103817 #103817
Hi,


ich möchte das Alter von mehreren Dateien (im selben Verzeichnis) auf einem anderem PC abfragen, dann in einem Array speichern, damit ich die einzelnen Werte (Datum) weiterverarbeiten kann.
Allerdings hab ich da noch ein kleines Problem mit dem "als array abspeichern".


So sieht mein Code aus:
Code (perl): (dl )
1
2
3
4
5
6
my $ssh_surv = Net::SSH::Perl->new($_[1], debug => 1);
        $ssh_surv->login();

        # alter/abspeicherdatum aller .ssf dateien im ordner ermitteln (ca. 10 Dateien)
        my($out, $err, $exit) = $ssh_surv->cmd("ls -l ./pfad/*.ssf | awk '{\$6}'");
        print "$out\n";  # print nur als beispiel



Hier scheint ja klar zu sein, da $out ein skalar/string ist, dass er nicht eine liste von 10 zeilen/einträgen abspeichern kann.
Es kommt folgende Fehlermeldung
" Use of uninitialized value in concatenation (.) or string "

Wenn ich $out aber in @out ändere, bekomme ich immernoch die selbe Fehlermeldung.

Wäre nett, wenn mir jemand sagen könnte, wie das zu lösen ginge.





PS: (nur zur Info) wenn ich ls -l ./pfad/*.ssf | awk '{print $6}' in einer shell eingebe, kommt folgendes heraus:

2007-12-10
2007-12-10
2007-12-10
2007-12-13
2007-12-13
2007-12-13
2007-12-13
2007-12-10
2007-12-10
2007-12-10
Gast Gast
 2007-12-13 12:47
#103818 #103818
hintergund info


ich möchte das Datum aller dieser ssf dateien mit dem jetzigen Datum vergleichen, um heraus zu finden, wie alt die dateien sind.

Falls ihr noch einen anderen , besseren/einfacheren weg kennt, um das alter von dateien herauszubekommen, wär ich sehr angetan, wenn ihr den posten könntet :D
Gast Gast
 2007-12-13 14:51
#103820 #103820
hm, also wenn ich es so mache, dann bekomme ich die erste zeile/datei ausgegeben.
Code (perl): (dl )
1
2
my($out, $err, $exit) = $ssh_surv->cmd("ls -l ./pfad/*.ssf | awk '{print \$6, \$7}'");
print "$out";


Ausgabe: 2007-12-13 13:48



Eine Fehlermeldung kommt nicht mehr, aber selbst mit @out anstatt $out bekomme ich eben immer nur die 1. Zeile/Datei und nicht alle.
murphy
 2007-12-13 15:56
#103825 #103825
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Ich habe zwar keine Ahnung von CPAN:Net::SSH::Perl, aber normalerweise werden im ersten Array auf der linken Seite einer Zuweisung alle verbleibenden Rückgabewerte gespeichert. Nach my (@out, $err, $exit) = $ssh->cmd($cmd) sollte also @out alle Rückgabewerte des Methodenaufrufes enthalten und $err bzw. $exit sollten undef sein.

Nach der Dokumentation von CPAN:Net::SSH::Perl zu schließen kann das Modul das, was Du brauchst wahrscheinlich gar nicht. Eine Alternative könnte CPAN:Net::SSH::Expect sein.
When C++ is your hammer, every problem looks like your thumb.
Gast Gast
 2007-12-13 16:08
#103826 #103826
also bei
Code (perl): (dl )
1
2
my($out, $err, $exit) = $ssh_surv->cmd("ls -l ./pfad/");
        print "$out";

wird der komplette ordnerinhalt angezeigt. auch in mehreren Zeilen. Und ich habe nichtmal @out benutzt, sondern nur $out ....
Also liegts daran wohl doch nicht, aber was könnte sonst das problem sein?
murphy
 2007-12-13 16:14
#103827 #103827
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Gast+2007-12-13 11:47:33--
[...]
Falls ihr noch einen anderen , besseren/einfacheren weg kennt, um das alter von dateien herauszubekommen, wär ich sehr angetan, wenn ihr den posten könntet :D


Um alle Dateien eines bestimmten Alters zu finden, bietet find einige Möglichkeiten. Zum Beispiel liefert find . -maxdepth 1 -newermt '1 hour ago' alle Dateien im aktuellen Verzeichnis, die in der letzten Stunde modifiziert wurden.

Vielleicht ist es auch praktisch, das Alter einer Datei direkt aus Perl heraus zu bestimmen:
Code (perl): (dl )
1
2
3
4
5
6
7
use strict;
use warnings;

my $file = $ARGV[0] or die "No argument given\n";
my $age = time - (stat($file))[9];

print "$file was last modified $age seconds ago\n";
When C++ is your hammer, every problem looks like your thumb.
Gast Gast
 2007-12-13 16:57
#103831 #103831
Quote
Um alle Dateien eines bestimmten Alters zu finden, bietet find einige Möglichkeiten. Zum Beispiel liefert find . -maxdepth 1 -newermt '1 hour ago' alle Dateien im aktuellen Verzeichnis, die in der letzten Stunde modifiziert wurden.

Ja, allerdings kann ich mit den Dateien direkt nichts anfangen, sondern ich brauche ja nur das Alter der Datei ^^.



state wäre eine gute alternative, allerdings habe ich da dann wieder genau das selbe problem, dass ich dann auch wieder nur die erste Zeile/Datei rausbekomme. Das wäre natürlich eine notlösung, aber dann müsste ich, um das alter aller dateien in einem Ordner heraus zu bekommen pro Datei per SSH connecten, alter abfragen, ssh-connection schließen.
Also wenn ich viele Dateien überprüfen will, dann würde das durch das wiederholte Verdinden viel Zeit in anspruch nehmen.

Also scheint das Problem doch bei dem SSH-Modul selbst zu liegen (Net::SSH::Perl), aber was mich eben echt wundert ist, dass es bei
ls -l /pfad/ klappt - aber bei
ls -l | awk {print $6} oder
state /pfad/datei nicht -.-
is doch echt komisch
murphy
 2007-12-13 21:56
#103852 #103852
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Das ist in der Tat merkwürdig. Aber wie gesagt, CPAN:Net::SSH::Expect könnte eine Alternative zu dem von Dir verwendeten Modul sein.

Als unsaubere Notlösung könntest Du noch die Ausgabe deines Befehls durch tr -s '\012\015' '\000' pipen und in Perl mit split /\0/, $input wieder in ein Array von Zeilen verwandeln.

edit: Wenn Du auf dem Server die Ausgabe mit Perl erzeugst, kannst Du in diesem Fall natürlich direkt in Deinen print-Befehlen "\0" statt "\n" als Trennzeichen benutzen und musst nicht tr bemühen.
When C++ is your hammer, every problem looks like your thumb.
Gast Gast
 2007-12-14 10:02
#103866 #103866
vielen dank für die antwort :)

werd ich gleich mal testen
Gast Gast
 2007-12-14 11:34
#103873 #103873
Es geht :D


allerdings wäre es auch mit Net::SSH::Perl gegangen ... ich hab nur einen ziemlich dummen Fehler gemacht >_<
Und zwar hatte ich beim Pfad das Unterverzeichnis vergessen anzugeben, in dem sich die 10 dateien befinden.
Im Verzeichnis darüber, wleches das prog dann gecheckt hat, war genau eine dieser dateien enthalten ........
man, ich könnt mich schlagen :D


Trotzdem Danke für deine Hilfe :)
Das Net::SSH::Expect scheint darüberhinaus sogar besser für mein vorhaben geeignet zu sein^^
<< >> 10 Einträge, 1 Seite



View all threads created 2007-12-13 12:45.