ПРИМЕЧАНИЕ: на самом деле здесь два вопроса. Один из них: «Я хочу выполнить нетривиальную задачу на удаленном сервере, доступном через SSH». Другой - «Я пытаюсь передать сложную строку команде, и аргумент в конечном итоге отличается от того, что я намеревался». Я отвечаю на вопрос низкого уровня, не обсуждая, является ли используемый подход «правильным» (удобный, не подверженный ошибкам, безопасный и т. Д.) Для решения высокого уровня. Как указано в других ответах и комментариях, вполне возможно, что нет.
Ваша командная строка в основном правильная; вам нужно только немного изменить цитату.
Основная проблема заключается в том, что строки в двойных кавычках расширяются вашей локальной оболочкой, и поэтому $(...)
части будут оцениваться в вашей локальной системе. Чтобы передать их в удаленную систему, вы должны заключить скрипт в одинарные кавычки.
У вас также есть некоторые кавычки. В вашем оригинальном сценарии есть аргументы для двух echo
s; если вы измените внешнюю цитату на одинарную, то это будет скрипт awk. Это эффективно приводит к тому, что кавычки опускаются, что не беспокоит echo
s, но это испортит скрипт awk, так как знак больше чем станет перенаправлением вывода. Поэтому после изменения внешних кавычек на одинарные кавычки измените их на двойные.
Это ваш скрипт с исправленной цитатой. У скрипта могут быть другие проблемы, я просто исправил синтаксис.
#!/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'