string mit skript über SSH schicken

chinamaschiene

Lt. Commander
Registriert
Mai 2008
Beiträge
1.257
Hallo,

ich hoffe jemand kann mir bei diesem etwas spezielen problem helfen. ich möchte gerne ein skript ausführen dem ein string übergeben wird. also z.B. skript.sh string1. das ist ja auch kein problem. nur liegt dieses skript auf einem anderen computer (PC 2) zu dem ich mit ssh eine verbindung aufbauen kann. den zu übermittelnden string kennt nur PC1.
das lässt sich ja wohl mit ssh realisieren. das problem ist das ich bei jedem aufruf von dem skript auf PC1 das passwort für PC2 eingeben muss (auf dem das skript gestartet wird).

gibt es da eine möglichkeit das man nur einmal das passwort eingeben muss? also das beim zweiten aufruf des skripts auf PC1 direkt der befehl ./skript.sh string auf PC2 gestartet wird. (mit der selben session)

tips würden mich sehr freuen

EDIT
ich kann ja in kde auch eine ssh session in der konsole zu PC2 starten und die bleibt dann auch offen. es würde also reichen in dieses ssh fenster befehle per skript "injecten" zu können.
 
Zuletzt bearbeitet:
Mit ssh-key kannst Passwort umgehen.
Wie man das macht einfach man ssh-keygen mal anschauen.

Ich habe das ganze mit einem Shellscript einfach gelöst, indem die Rechnernamen aufgelistet sind und mittels dieses Skript tut die ganze Schleife mit ssh oder wahlweise scp commando.

Auszug von unserem Rechenpool:
Mit Beispiel 4 PCs; hostname: PC0, PC1, PC2 und PC3

Code:
root@PC0:~# script.sh uptime
PC1:
 12:30:46 up 41 min,  3 users,  load average:  0.47, 0.81, 0.40

PC2:
 12:30:46 up 41 min,  0 users,  load average:  1.29, 1.01, 0.42

PC3:
 12:30:47 up 41 min,  1 users,  load average:  0.25, 0.20, 0.16
 
Zuletzt bearbeitet:
hey. vielen dank für die antwort. habe mir gerade die gesamte manpage von ssh-keygen durchgelesen aber kann nicht die option finden die mir da nutzen soll. das ist ja nur zum erstellen / löschen / verändern / exportieren / importieren von keys. ssh-key finde ich gar nicht.

wärst du bereit vielleicht noch einen genaueren hinweis zu liefern? vielleicht würde mir der quelltext von deinem skript.sh auch helfen.

sorry für die blöden fragen

liegt evtl daran das ich manche sachen nicht ganz verstehe. z.b. die optionen
-G -T -S oder -B
 
Zuletzt bearbeitet:
Zunächst machst du ssh-keygen -t dsa für dsa oder ssh-keygen -t rsa für rsa, da die Maschine i.d.R. schon 2 ssh-hostkey (dsa und rsa) haben sollte.

Tipp: Passwort brauchst du nicht einzugeben, einfach leer lassen, bzw. enter drucken, denn der Schlüsselaustausch macht die Schlüsselpaare selbst.

Dann die erzeugte Datei, meist gespeichert unter /root/.ssh/ kurz anschauen, es soll Public-Key stehen, der id_dsa.pub oder id_rsa.pub heisst, je nachdem was du davor erstellt hast, diese machst du einfach cat id_*.pub > authorized_keys
dann auch die Public-keys von Rechnern mit dem du zugreifen willst.

Der oben genannten Script hat nichts mit ssh-keygen zu tun, dieser spart nur meine Tipparbeit an mehreren Rechner, die ich verwalte.
 
sorry ich verstehe nicht was mir das bei meiner aufgabe mit dem string an ein skript übergeben bringen soll. das verfahren habe ich ja schon längst gemacht. genau über das public key verfahren melde ich mich ja schon jetzt an pc 2 an. nur das die keys mit einem passwort geschützt sind.

ich will aber in einer session eingeloggt bleiben und dann ein skript mit einem string als parameter aufzurufen und nur einmal das passwort eingeben.

hoffe auf weitere hilfe.
 
Du suchst sowas wie expect (http://expect.nist.gov/), womit du die interaktiven Rückfragen der ssh per Skript beantworten kannst. Beispiel für ein workerskript, was das PW und deinen String per Parameter bekommt: (skipte ungetestet, Prinzip sollte klar sein)

#!/usr/bin/expect -f
set timeout 3
set pw [lrange $argv 0 0]
set string [lrange $argv 1 1]
spawn /usr/bin/ssh name@host /irgend/ein/programm $string1
expect "assword:"
send -- "$pw\r"
expect eof

Und drumherum einen control-Skript, was einmal das PW abfragt und den worker 10 mal aller 5 min startet:

#!/bin/bash
echo "pw her!"
read pw
string="dein_string_halt"
counter=0
while [ $counter -lt 10 ]; do
/pfad/zum/worker $pw $string
$counter=$(($counter+1))
sleep 300
done

Problem bei der Variante ist die PW-Übergabe an den Worker per Parameter, den andere Leute auf dem gleichen Rechner per ps ggf. lesen können. Wenn das eine Rolle spielt entweder die PW-Übergabe anders machen (pipe?, tmpfile?) oder die einmalige PW-Abfrage und das wiederholte Starten der ssh alles ins expect-Skript packen. In der expect-Manpage findest du ein Beispiel dazu unter dem Thema "disconnect".

Ich denke mal mit dem Hinweis auf expect bekommst du das schon hin.
 
danke für die antwort. mir ist aber nicht wohl dabei das passwort im klartext in einer ascii-datei zu speichern außerdem muss ich sofort einen string übergeben können. das pollen alle x sekunden bringt mir nicht wirklich was. dennoch ist das expect tool eine gute sache. das kann mir bestimmt mal nützlich sein.

für alle interessierten: ich habe das jetzt mit ssh-agent gelöst:

~/.xinitrc

Code:
exec ssh-agent startkde

das bewirkt das der ssh-agent kde startet. wird kde beenden wird auch ssh-agent beendet und damit das gecachte passwort gelöscht.

zur grafischen eingabe des passworts wird eine umgebungsvariable systemweit gesetzt. z.b. mit export. dafür nehme ich ssh-askpass-fullscreen. alternative wäre z.b. auch x11-ssh-askpass.

Code:
SSH_ASKPASS="/usr/bin/ssh-askpass-fullscreen"

in kde wird nun das skript skript.sh über die tastenkombinaton WIN+W aufgerufen:

skript.sh

Code:
#!/bin/bash

ssh-add -l | grep -q "$(ssh-keygen -l -f ~/.ssh/id_rsa | cut -d " " -f 2)"
[[ $? -ne 0 ]] && ssh-add

string=$(qdbus org.kde.klipper /klipper getClipboardHistoryItem 0)
ssh remotepc "/remoteskript.sh $string"

das skript überprüft zuerst ob der fingerprint des aktuellen users sich im ssh-agent befindet. bzw. besser gesagt, ob das passwort bereits gecached ist. falls das nicht der fall ist wird ssh-add aufgerufen das die grafische eingabe des passworts für den privaten schlüssel verlangt. ==> das passwort wird gecached und muss bis zum kde ende nicht mehr eingetippt werden

der zu übergebende string befindet sich in der zwischenablage von kde und wird mit einem simplen ssh aufruf an das remoteskript übergeben.

FERTIG!
 
Zuletzt bearbeitet:
Zurück
Oben