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