2017-12-18 3 views
1

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?

+0

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. –

Antwort

3

Es ist eine Frage des Zitats in der richtigen Weise. Es gibt mehr als eine Möglichkeit, dies zu tun. Ich finde doppelte Anführungszeichen einfacher für diesen Fall zu arbeiten:

echo "su -c \"ssh -p 1234 [email protected] 'cd /home/ && tar -cf - remoteuser/' | pv > /home/staging/localuser/staging.tar\" localuser" 

Drucke:

su -c "ssh -p 1234 [email protected] 'cd /home/ && tar -cf - remoteuser/' | pv > /home/staging/localuser/staging.tar" localuser 

Was ich denke, ist das, was Sie suchen. Das heißt, mit \" beliebigen doppelten Anführungszeichen innerhalb der äußeren Anführungszeichen zu entkommen. So versuchen:

/bin/bash -c "su -c \"ssh -p 1234 [email protected] 'cd /home/ && tar -cf - remoteuser/' | pv > /home/staging/localuser/staging.tar\" localuser" 
+0

Großer Mann, ich kann dir nicht genug danken. Ich habe 2 Stunden lang versucht, das herauszufinden. Es funktioniert jetzt großartig – Guerrilla

3

Hier hier-Dokumente kommen in praktisch:

bash <<'END' 
su -c "ssh -p 1234 [email protected] 'cd /home/ && tar -cf - remoteuser/' | pv > /home/staging/localuser/staging.tar" localuser 
END 

Notiere die -c Option entfernt wurde: bash die Befehle von stdin gelesen.