shell befehl über ssh ausführen



  • Hallo,

    ich möchte über einen ssh kanal den Befehl "find" am fremden Rechner ausführen und das Ergebnis von "find" in eine Variable speichern.

    ssh -p $port user@$myip -t mybackupfile='find /backup/*$aktdate.tar.gz'
    
    1. Als Rückmeldung kommt
    "bash:/ /backup/dateiname_03.11.2018.tar.gz: keine Berechtigung"
    

    Ich will ja nicht die Datei kopieren oä. Ich möchte nur den find Befehl ausführen und den gefundenen Dateinamen in die Variable schreiben damit ich dies in meinem Script weiter verarbeiten kann/könnte

    1. Die ssh Verbindung funktioniert, da ich auch schon einen anderen Befehl (ohne Rückmeldung) am Fremdrechner
      ausführen lasse

    Danke



  • Scheinbar hat dein user nichtmal leserechte im verzeichnis /backup bzw. auf die datei

    Funkioniert das find wenn du dich erst per ssh remote eingeloggt hast?



  • Ich denke dein Remote Befehl wird beim Leerzeichen getrennt und ergibt dann "/backup/*$aktdate.tar.gz" was dem Ausführen der Datei entspricht. Wenn du eine Befehlszeile als Parameter übergibst solltest du Anführungszeichen drumherum machen.

    Ansonsten wird mybackupfile nicht das Ergebnis des Befehls, sondern der Befehl selber zugewiesen. Zum Ausführen werden Backticks verwendet.



  • @worst_case sagte in shell befehl über ssh ausführen:

    Hallo,

    ich möchte über einen ssh kanal den Befehl "find" am fremden Rechner ausführen und das Ergebnis von "find" in eine Variable speichern.

    ssh -p $port user@$myip -t mybackupfile='find /backup/*$aktdate.tar.gz'
    

    [...]

    So etwas (ungetestet)?

    mybackupfile=$(ssh -p $port user@$myip -t find /backup/*$aktdate.tar.gz)
    


  • Hallo,

    vielen Dank für den schnellen Tips.

    1. Auch wenn ich der datei alle Rechte für alle User gebe ändert das nichts
    2. Das find funktioniert auf dem remote im Terminal
    3. Wenn das in Anführungszeichen einschliesse
    ssh -p $port user@$myip -t "mybackupfile=`find /backup/*$aktdate.tar.gz`"
    
    kommt die Fehlermeldung
    
     find: ‘/backup/*03.11.2018.tar.gz’: Datei oder Verzeichnis nicht gefunden
    
    
    1. mybackupfile=$(ssh -p portuser@port user@myip -t find /backup/*$aktdate.tar.gz)
      Es wird überhaupt keine ssh Verbindung mehr aufgebaut. Der ssh findet den globalen publickey im /home/user/.ssh/
      Verzeichnis nicht mehr.
      Rückmeldung:
    Permission denied (publickey,keyboard-interactive).
    

    Bitte weiter Ideen senden, ich probiere alles aus.

    Danke



  • @worst_case sagte in shell befehl über ssh ausführen:

    [...]
    4. mybackupfile=$(ssh -p portuser@port user@myip -t find /backup/*$aktdate.tar.gz)
    Es wird überhaupt keine ssh Verbindung mehr aufgebaut. Der ssh findet den globalen publickey im /home/user/.ssh/
    Verzeichnis nicht mehr.
    Rückmeldung:

    Permission denied (publickey,keyboard-interactive).
    

    Hmm, das müsste dann ein anderes Problem sein. Bei

    mybackupfile=$(ssh -p $port user@$myip -t find /backup/*$aktdate.tar.gz)
    

    sollte noch das '*' maskiert werden damit es nicht lokal ausgewertet wird. Und der Rest in '"'. So z.B.

    mybackupfile=$(ssh -p "$port" user@"$myip" -t find '/backup/*'"$aktdate.tar.gz")
    

    Wofür eigentlich -t bei dem Aufruf? Kommt bei mir nur Schrott zurück.
    Bei mir zumindest funktioniert folgendes (ohne -t):

    > x=test
    > echo $x
    test
    > xx=$(ssh user@host find './zeugs/*'"$x")
    > echo $xx
    ./zeugs/kvmtest ./zeugs/kvmtest/[...] ./zeugs/memtest ./zeugs/memtest/[...]
    > 
    
    

    Edit:
    PS: Bei dem Beispiel kam public-key-auth. zur anwendung.



  • Hallo,

    ein

    mybackupfile=$(ssh -p $port user@$myip -t find '/backup/*'"$aktdate.tar.gz")
    

    brachte den Erfolg. Es muss also das * maskiert werden.

    vielen Dank



  • @worst_case
    Ich frage mich, was Du eigentlich machen willst. Ich vermute, dass Du auf dem Remote Rechner im Verzeichnis /backup eine Datei mit dem Namen $aktdate.tar.gz suchst.

    Der Befehl find erwartet als ersten Parameter ein Verzeichnis. Dann kommen die Bedingungen. Also willst Du doch das Kommando

    find /backup -name $aktdate.tar.gz
    

    ausführen. Über ssh geht das dann so:

    mybackupfile=$(ssh -p $port user@$myip "find /backup -name $aktdate.tar.gz")
    

    Wichtig sind die Gänsefüßchen statt Hochkommata. Die sagen der lokalen shell, dass sie $aktdate expandieren soll, so dass auf der remote-Seite dann der expandierte Dateiname, wie z.B. 03.11.2018.tar.gz ankommt.


  • Global Moderator |  Mod

    @tntnet sagte in shell befehl über ssh ausführen:

    @worst_case
    Ich frage mich, was Du eigentlich machen willst.

    Interessant ist nicht nur der Sinn der einen Zeile, sondern die Absicht hinter dem Gesamtscript. Fragen zu ungewöhnlichen Scriptingmustern, wie hier, kommen fast immer dann wenn ein unerfahrener Scriptschreiber sich in einem selbst ausgedachten Lösungsweg verfährt, weil er sich einer viel naheliegenderen, einfacheren Lösung gar nicht bewusst ist.