REMARQUE: il y a en fait deux couches à la question ici. L'une est «Je veux exécuter une tâche non triviale sur un serveur distant accessible via SSH». L'autre est «J'essaie de passer une chaîne complexe à une commande, et l'argument finit par être différent de ce que je voulais». Je réponds à la question de bas niveau sans discuter si l'approche utilisée est "correcte" (pratique, sans risque d'erreur, sécurisée, etc.) pour résoudre la question de haut niveau. Comme indiqué par les autres réponses et commentaires, ce n'est probablement pas le cas.
Votre ligne de commande est généralement correcte; il suffit de changer un peu la citation.
Le problème principal est que les chaînes entre guillemets doubles sont développées par votre shell local, et donc les $(...)
pièces seront évaluées sur votre système local. Pour les transmettre au système distant, vous devez placer le script entre guillemets simples.
Vous disposez également de guillemets intégrés. Dans votre script d'origine, il y a les arguments pour les deux echo
s; si vous changez la citation externe en guillemets simples, ce sera le script awk. Ces résultats entraînent la suppression des guillemets, ce qui ne dérange pas le echo
s, mais cela gâchera le script awk, car le signe supérieur à deviendra une redirection de sortie. Ainsi, après avoir modifié les guillemets externes en guillemets simples, changez-les en guillemets doubles.
Ceci est votre script avec la citation fixe. Le script peut avoir d'autres problèmes, je viens de corriger la syntaxe.
#!/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'