• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[solved] Remote execution von Commands

framp

Moderator
Teammitglied
Hallo,

so langsam nervt es :? . Ich habe mehrere rechner und moechte immer mal wieder nur kurz irgendwelche commands auf dennen von remote ausfuehren. Bislang benutze ich ssh um mich dort einzuloggen. Danach habe ich ein shell script geschrieben welches eingegebene commands per ssh remote forwarded. Das funktioniert aber auch nicht so recht.
Code:
echo "Executing command '$*' on gateway"
ssh user@gateway /bin/bash -l $*

Es muesste doch mit dem Teufel zugehen wenn es da bei Linux nicht einen einfacheren Weg gibt. Wie administriert Ihr remote Systeme per command line?
 
OP
framp

framp

Moderator
Teammitglied
rexec ist leider genauso alt wie telnet ... und uebertraegt das PW im Klartext. Leider nix fuer mich :cry:
 
Moin framp,

nenn mich altmodisch, aber ich möchte sehen ob irgendwelche Meldungen kommen wenn ich einen Befehl absetze, also melde ich mich an der Kiste an. Die Passwort-Geschichte ist bei ssh ja nicht mehr nötig wenn man es auf asynchrone Verschlüsselung stellt und ein 'ssh Rechner' ist es mir wert. http://www.online-tutorials.net/security/secure-ssh-tutorial-part-2-identity-pubkey-authentifizierung/tutorials-t-69-202.html
falls dir die Methode unbekannt ist (oder ein Newbie diesen Thread ließt)

[Edit by Geier0815] es heißt asynchrone Authentifizierung, nicht Verschlüsselung![/Edit]
 
OP
framp

framp

Moderator
Teammitglied
Geier0815 schrieb:
... aber ich möchte sehen ob irgendwelche Meldungen kommen wenn ich einen Befehl absetze
Ich auch. Deshalb den Trick mit einem shellScript welches ssh und keys benutzt. Nur leider gehen da eben nicht alle Commands. Man hat irgendwie keine 'richtige' shell.

Klar kann ich fuer jeden remote Rechner per ssh eine shell aufmachen. Ich bin aber faul :lol: . Ich moechte einfach sowas wie
Code:
rexec [hostname] [command]
und dann das Ergebnis im momentanen Fenster sehen - also nicht immer die Fenster wechseln :cry:
 

Robocratic

Newbie
Ein Kollege von mir hat da mal 'n hübsches Tool für Remote-Zugriffe geschrieben, das mit SSL-Verschlüsselung arbeitet. Brauch ich nur schreiben "resc [host] [shellcommand]" und krieg dann alles auf meiner Konsole zu sehen.

Leider möchte unser Chef bisher nicht, dass das OpenSource wird... Und besagter Kollege hat 'n knappes Jahr dran gearbeitet. Ist ein ziemlich mächtiges Tool, das noch viel mehr kann :D
 
OP
framp

framp

Moderator
Teammitglied
Das klingt so als waere das genau das was ich suche. Kannst Du vielleicht kurz die Methode, die angewandt wird um die Befehle remote auszufuehren und die Ergebnisse zu erhalten, skizzieren? U.U. baue ich mir dann selbst ein Script. Das kann dann aber jeder haben :wink:
 

Robocratic

Newbie
Nun ja, ich denke mal, dass er remote 'ne Shell öffnet, einen Befehl absetzt und dann das abgreift, was remote auf STDOUT und STDERR geschrieben wird. Mehr kann ich da jetzt nicht zu sagen, weil ich in dem Bereich noch totaler Newb bin *seufz*

Die Betonung liegt wohl auf "hat er 'n knappes Jahr dran gearbeitet"... :shock:
 

oc2pus

Ultimate Guru
give it a try ...

http://www.jerith.za.net/code/remoteexec.php

Another script written with my Open Source lab developer hat on. We have a rather large number of client machines to administer, so some way of automating running commands on them is a Good Thing. We have a cron job that mounts a directory on the backend server and runs a script there, but there are occasions when this doesn't work properly or stuff needs to be done now.

Ssh is nice. So is using a private/public keypair to authenticate so you don't have to do passwords. Python is even nicer. This is what happens when you put them all together.....

abspeichern des Scriptes als myCMD.py
chmod +x myCMD.py
dann myCMD.py -m 192.168.0.1 -u ICH -f <cmd-file>

und <cmd-file> enthält die auszuführenden Kommandos

die stdout/stderr Ausgaben des remote Rechners werden auf der lokalen Konsole ausgegeben, was will man mehr ;)
 
framp schrieb:
Code:
echo "Executing command '$*' on gateway"
ssh user@gateway /bin/bash -l $*
Und was genau geht nicht?
Code:
13:01 alphagate:~ > ssh jen@alphagate /bin/ls -l 
Password: 
total 1744
drwx------  4 jen root   4096 Dec 31 02:02 boinc
drwxr-xr-x  4 jen root   4096 Sep 23  2005 bsrc
-rw-r--r--  1 jen root    308 Nov 15  2005 eurodance.pls
-rw-r--r--  1 jen root 542720 Feb 28  2005 flaschen.tar
Sonst probiers mal mit:
/bin/bash -l "$@"
 

bolder

Member
so geht es doch am einfachsten:

# ssh Servername 'Kommando'

also z.B.:

# ssh Servername 'ls -l'

da sieht man direkt das Ergebnis.

Gruß
Olaf
 
OP
framp

framp

Moderator
Teammitglied
@bolder und jengelh

Das habe ich auch schon ausprobiert. ls funktioniert ohne Probleme. Aber alle Programme aus /usr/local/bin werden nur gefunden wenn ich den Pfad mit angebe. Ist etwas umstaendlich :cry: . Wenn ich direkt per ssh auf dem Rechner bin geht alles ohne Pfad. Es gibt aber keine ssh Option die diesbezueglich irgendwas aendert :cry: .

@oc2pus

Thx for the pointer. Out of the shell usage hat bei mir ein Problem: Irgendwie erkennt das Proggi nicht, dass ich einen gueltigen ssh Key habe und prompted immer nach einem PW :cry: . Um das Problem zu loesen muss ich mich wohl in Python einlesen.
 

ukd

Newbie
Das "-l" könnte stören. Um sich unter einem anderen Benutzernamen anzumelden, kann man nämlich ssh auch so starten:

Code:
ssh -l RUSER RHOST "COMMAND"

Im Zweifelsfall sollte man immer Anführungszeichen setzen. Wenn nämlich COMMAND ein "-l" enthält, könnte das von der Shell auf ssh bezogen werden.
 
OP
framp

framp

Moderator
Teammitglied
Also ich habe durch das Python Script und Eure Beispiele einen Weg gefunden. Er ist einfach aber nicht flexibel aber erfuellt meine Ansprueche:

1) Einrichten von public keys in ssh (Habe ich schon, just for completeness)

2) Erstellen einer Datei ~/.ssh/environment auf dem Zielsystem in der steht
Code:
PATH=/home/hugo/bin:/usr/local/bin:/usr/bin:/usr/X11R6/bin:/bin
und

3) Aufruf
Code:
ssh host Command

Dann kann Command sowohl ein embedded Befehl sein (ls) als auch irgendein Programm im Pfad.

Schoener waere es wenn die PATH Variable irgendwie auf den Inhalt gesetzt werden koennte, den sie erhaelt wenn man sich normal per ssh anmeldet. Ich habe gesucht, gelesen, probiert ... und dann aufgegeben. Die quick and dirty Methode reicht mir auch :lol:
 

ukd

Newbie
Eigentlich sollte

Code:
ssh remote-host "my_command"

genügen. Falls Programme in /usr/local/bin nicht gefunden werden,
kann man entweder explizit seine Profildatei einlesen:

Code:
ssh remote-host ". .profile; my-command"

(In .profile, .dtprofile, .bashrc oder wie auch immer das Ding heißt
sollte $PATH entprechend definiert werden).
ODER
man erzeugt auf dem Zielrechner eine Datei ~/.ssh/environment,
in die man seine PATH-Definition schreibt.
 
Oben