HINWEIS: Die Frage besteht aus zwei Ebenen. Eine lautet: "Ich möchte eine nicht triviale Aufgabe auf einem Remote-Server ausführen, auf den über SSH zugegriffen werden kann." Das andere ist: "Ich versuche, eine komplexe Zeichenfolge an einen Befehl zu übergeben, und das Argument unterscheidet sich letztendlich von dem, was ich beabsichtigt habe." Ich beantworte die Frage auf niedriger Ebene, ohne zu diskutieren, ob der verwendete Ansatz "richtig" ist (praktisch, nicht fehleranfällig, sicher usw.), um die Frage auf hoher Ebene zu lösen. Wie aus den anderen Antworten und Kommentaren hervorgeht, ist dies möglicherweise nicht der Fall.
Ihre Befehlszeile ist größtenteils richtig. Sie müssen das Zitat nur ein wenig ändern.
Das Hauptproblem besteht darin, dass Zeichenfolgen in doppelten Anführungszeichen von Ihrer lokalen Shell erweitert werden und die $(...)
Teile daher auf Ihrem lokalen System ausgewertet werden. Um sie an das Remote-System weiterzuleiten, müssen Sie das Skript in einfache Anführungszeichen setzen.
Sie haben auch einige eingebettete Anführungszeichen. In Ihrem ursprünglichen Skript gibt es die Argumente für die beiden echo
s; Wenn Sie das äußere Anführungszeichen in einfache Anführungszeichen ändern, handelt es sich um das awk-Skript. Diese führen effektiv dazu, dass die Anführungszeichen weggelassen werden, was das echo
s nicht stört , aber das awk-Skript durcheinander bringt, da das Größer-als-Zeichen zur Ausgabeumleitung wird. Nachdem Sie die äußeren Anführungszeichen in einfache Anführungszeichen geändert haben, ändern Sie diese in doppelte Anführungszeichen.
Dies ist Ihr Skript mit festem Zitat. Das Skript kann andere Probleme haben, ich habe nur die Syntax behoben.
#!/bin/bash
ssh -t test@192.168.94.139 'cd /var/www/test.com/backup ;
if [ $(ls | wc -l) -lt 3 ]
then
echo "Less"
else [ $(ls -t *.tgz|awk "NR >3"|xargs rm -f) ]
echo "deleted"
fi'