Показать статистику
0 голосов
от (2.5тыс. баллов)

Имеется конструкция if для подсчета количества файлов и удаления всех файлов, кроме последних трех. Я хочу запустить эту команду удаленно. Как можно сочетать ssh с if условием?

Вот мой скрипт, который не выполняется из-за ошибки:

#!/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"

Ошибку выдало такую вот

ls: cannot access *.tgz: No such file or directory
564 просмотров 1 ответов
от (26.4тыс. баллов)
0

Можно разместить скрипт на удаленной машине и просто выполнить его через ssh, вот еще одно предложение, как это можно сделать так, как вы хотите:

#!/bin/bash
HOST='test@192.168.94.139'
REMOTE_PATH='/var/www/test.com/backup'
COMMAND1="ssh \"$HOST\" 'ls \"$REMOTE_PATH\" | wc -l'"
COMMAND2="ssh \"$HOST\" 'ls -t \"$REMOTE_PATH\"/*.tgz'"
COMMAND3="xargs ssh \"$HOST\" rm -rf"
if [[ $(eval "$COMMAND1") -le 3 ]]
then
echo "Less"
else
eval "$COMMAND2" | awk 'NR > 3' | eval "$COMMAND3" && echo "Deleted"
fi

Условное выражение -lt заменяется на -le.

eval - построение команды путем объединения аргументов.

1 Ответ

0 голосов
от (26.4тыс. баллов)

Ваша командная строка в основном правильная, но вам стоит  лишь немного изменить конструкцию.

Основная проблема заключается в том, что строки в двойных кавычках расширяются вашей локальной оболочкой, и поэтому $(...) части будут оцениваться в вашей локальной системе. Чтобы передать их в удаленную систему, вы должны заключить скрипт в одинарные кавычки.

У вас также есть встроенные кавычки. В вашем оригинальном сценарии есть аргументы для двух echos.  Если же вы измените внешнюю кавычку на одинарную кавычку, это будет скрипт awk. Это эффективно приводит к тому, что кавычки опускаются, что не беспокоит echos, но это испортит скрипт 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'
от (26.4тыс. баллов)
0

Вот  еще пример того, как может работать подсчет и удаление на удаленном хосте:

#!/bin/bash -e
tmp_dir="$(mktemp -d)"
ssh_cmd="$(cat <<-EOF
cd "$tmp_dir"
cnt_tgz=(\$(find . -type f -name "*.tgz"))
if [[ \${#cnt_tgz[@]} -lt 3 ]]; then
echo "less"
else
rm "\${cnt_tgz[@]}"
echo "deleted"
fi
EOF
)"
touch "$tmp_dir/1.tgz"
ssh -t localhost "$ssh_cmd"
touch "$tmp_dir/2.tgz" "$tmp_dir/3.tgz"
ssh -t localhost "$ssh_cmd"

Это ls -t *.tgz не сработает, поскольку глобализация происходит только в локальной системе http://tldp.org/LDP/abs/html/globbingref.html

Кроме того, используя ls для подсчета файлов не является хорошей идеей, поскольку она также возвращает запись как . , .. и каталоги.

...