Ich habe eine Anwendung, die wie so Befehle bash sendet:Nested bash Befehl Zitat gibt
/bin/bash -c "<command goes here>"
Dies funktioniert gut, aber ich habe ein Problem mit einem etwas komplizierten Befehl getroffen. Dieser Befehl ruft ein tar von einem SSH-Server ab, zeigt eine Fortschrittsleiste mit pv
an und speichert sie dann in einem lokalen Benutzerverzeichnis.
su -c "ssh -p 1234 [email protected] 'cd /home/ && tar -cf - remoteuser/' | pv > /home/staging/localuser/staging.tar" localuser
Ausführen diesen Befehl auf der Kommandozeile arbeitet manuell groß, aber ich kann mich nicht für das Leben herausfinden, wie dies zu /bin/bash/
als Argument zu übergeben.
Ich habe versucht:
/bin/bash -c "su -c "ssh -p 1234 [email protected] 'cd /home/ && tar -cf - remoteuser/' | pv > /home/staging/localuser/staging.tar" localuser"
und verschiedene Kombinationen unterschiedliche Syntax, aber ich bin zu raten, wie ich wirklich nicht verstehen, warum es nicht funktioniert.
ich es habe zu einem einfacheren Beispiel aufgeschlüsselt und erkennen, dass es funktioniert, wenn innerer Befehl Apostroph wie dieses einfache Beispiel verwendet, die den Home-Pfad erhält:
bash -c "su -c 'cd ~ && pwd' localuser"
aber, dass auf größeren Befehl versucht, verursacht es zum Scheitern verurteilt :
/bin/bash -c "su -c 'ssh -p 1234 [email protected] 'cd /home/ && tar -cf - remoteuser/' | pv > /home/staging/localuser/staging.tar' localuser"
Es sagt no passwd entry for user /home
so der Befehl aufgebrochen wird immer ich denke, die verschachtelte Apostrophe kaufen, aber ich bin nicht sicher, wie dies zu beheben.
habe ich versucht, doppelte Anführungszeichen außerhalb der einfachen Anführungszeichen setzen:
/bin/bash -c "su -c 'ssh -p 1234 [email protected] "'cd /home/ && tar -cf - remoteuser/'" | pv > /home/staging/localuser/staging.tar' localuser"
Aber dann sagt er es nicht das Verzeichnis finden. Es sieht so aus, als müsste ich den Befehl nur ein wenig verbessern, aber ich kann es nicht herausfinden. Kann mir jemand helfen?
Normalerweise, wenn ein Programm "einen Befehl an bash sendet", bedeutet dies, dass das Programm 'execl ("/bin/bash "," -c ", Ihr Befehl, NULL) aufruft;'. Dies bedeutet, dass Ihre Zeichenfolge nicht maskiert werden sollte. Sie sollten definitiv nicht versuchen, einen 'bash -c something'-Befehl zu schreiben, weil das bedeutet, dass Sie eine andere Shell durchlaufen müssen. –