Ausgabe von Remote Rechner in Variable übernehmen
Ausgabe von Remote Rechner in Variable übernehmen
am 23.02.2007 14:47:58 von Ralf Schmidt
Hallo,
ich hänge mal wieder an einem kleinen Problemchen.
Auf einem Remote-Rechner möchte ich per SSH den Befehl du -sh ausführen
und das Ergebnis in eine Variable bekomme oder in ein file schreiben.
Meine bisherigen fehlschlagende Versuche:
system("ssh", "$configfile{User}\@$configfile{Server}", "du -sh
$configfile{DirName}/* > du.log");
Schreibt mir die Daten zwar richtig, aber legt sie auf dem entfernten
Rechner ab.
my $variable
system("ssh", "$configfile{User}\@$configfile{Server}", "du -sh
$configfile{DirName}/* > du.log");
bringt eine 0, was auch klar ist. Der Prozess wurde ohne Fehler beendet.
Dann habe ich es mit qx() versucht.
my $test = qx(ssh $configfile{User}\@$configfile{Server}; ls -la;);
Hier hängt das Script.
Auch varianten mit | oder in "" gepackt hatten keine Erfolg gebracht.
Ich denke das es nur eine Kleinigkeit ist, die ich aber mangels
Erfahrung mit Perl nicht kenne oder übersehe.
In der Hoffnung auf eine "Erleuchtung" verbleibe ich.
GruÃ
Ralf
PS: Die Verbindung zum Remote Rechner funktioniert über ssh-key ohne PW!
Re: Ausgabe von Remote Rechner in Variable übernehmen
am 23.02.2007 17:00:56 von Phil
Am Fri, 23 Feb 2007 14:47:58 +0100 schrieb Ralf Schmidt:
> Hallo,
>
> ich hänge mal wieder an einem kleinen Problemchen.
>
> Auf einem Remote-Rechner möchte ich per SSH den Befehl du -sh ausführen
> und das Ergebnis in eine Variable bekomme oder in ein file schreiben.
>
> Meine bisherigen fehlschlagende Versuche:
> system("ssh", "$configfile{User}\@$configfile{Server}", "du -sh
> $configfile{DirName}/* > du.log");
system() gibt dir nur den Rückgabewert, wenn Du die Ausgabe des Programms
haben willst nimm Backticks oder eine Pipe.
@result = `$ssh_cmd`;
oder
open($fh, '>', 'du.log');
open($pipe, "$ssh_cmd |");
while (!eof($pipe)) {
print $fh <$pipe>;
}
close($pipe);
close($fh);
Wenn Du mehrere Kommandos auf einem Host ausführen willst, ohne
jedesmal eine neue Verbindung aufzubauen, hilft evtl. auch das Modul
Expect.
Re: Ausgabe von Remote Rechner in Variable übernehmen
am 23.02.2007 20:03:30 von Ralf Schmidt
Hallo Philipp,
Philipp E. Letschert schrieb:
> system() gibt dir nur den Rückgabewert, wenn Du die Ausgabe des
> Programms haben willst nimm Backticks oder eine Pipe.
>
> @result = `$ssh_cmd`;
die Kurzform von qx($ssh_cmd); ?
> oder
>
> open($fh, '>', 'du.log');
> open($pipe, "$ssh_cmd |");
> while (!eof($pipe)) {
> print $fh <$pipe>;
> }
> close($pipe);
> close($fh);
Das sieht interessant aus. Ich werde es mal testen.
>
> Wenn Du mehrere Kommandos auf einem Host ausführen willst, ohne
> jedesmal eine neue Verbindung aufzubauen, hilft evtl. auch das Modul
> Expect.
Auch das werde ich mir mal genauer ansehen.
Danke für Deine Tipps.
GruÃ
Ralf
Re: Ausgabe von Remote Rechner in Variable übernehmen
am 24.02.2007 06:49:34 von Phil
Am Fri, 23 Feb 2007 20:03:30 +0100 schrieb Ralf Schmidt:
> Hallo Philipp,
>
> Philipp E. Letschert schrieb:
>
>> system() gibt dir nur den Rückgabewert, wenn Du die Ausgabe des
>> Programms haben willst nimm Backticks oder eine Pipe.
>>
>> @result = `$ssh_cmd`;
>
> die Kurzform von qx($ssh_cmd); ?
ja, aber ich mag die backticks lieber, sind imho besser lesbar. Beachte
dass du im skalaren Kontext den Rückgabewert (wie bei system) und im
Listenkontext die Ausgabe des Programms bekommst, deswegen @result und
nicht $result.
Re: Ausgabe von Remote Rechner in Variable �en
am 24.02.2007 09:05:20 von Frank Seitz
Philipp E. Letschert wrote:
> Am Fri, 23 Feb 2007 20:03:30 +0100 schrieb Ralf Schmidt:
>>
>>die Kurzform von qx($ssh_cmd); ?
>
> ja, aber ich mag die backticks lieber, sind imho besser lesbar. Beachte
> dass du im skalaren Kontext den Rückgabewert (wie bei system) und im
> Listenkontext die Ausgabe des Programms bekommst, deswegen @result und
> nicht $result.
Das mit dem skalaren Kontext stimmt nicht, auch dann wird
die Ausgabe des Programms geliefert, in dem Fall als String.
Der Exitstatus des Programms steht auf $?.
GrüÃe
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: Ausgabe von Remote Rechner in Variable übernehmen
am 26.02.2007 10:11:36 von Ferry Bolhar
Philipp E. Letschert:
> >> @result = `$ssh_cmd`;
> >
> > die Kurzform von qx($ssh_cmd); ?
Eine (lesbarere?) Alternative. qx gibt es übrigens erst seit Perl 5.5.
> Beachte
> dass du im skalaren Kontext den Rückgabewert (wie bei system) und im
> Listenkontext die Ausgabe des Programms bekommst, deswegen @result und
> nicht $result.
Nein. Im Listenkontext bekommst du jede Zeile der Ausgabe in ein
Listenelement (wobei $/ als Trenner verwendet wird), im skalaren
Kontext bekommst du die gesamte Ausgabe in diesen Skalar. Den
Rückgabewert (Exit status) bekommt man in jedem Fall in $?.
LG, Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at