Назад | Перейти на главную страницу

Цикл bash для перемещения каталогов на удаленном хосте через ssh

Я пытаюсь найти способ выполнить следующий цикл на удаленном хосте через ssh.

По сути, он переименовывает серию каталогов для создания вращающейся резервной копии. Но это местное. Я хочу, чтобы он работал с каталогами на удаленном хосте.

while [ $n -gt 0 ];
    do {
    src=$(($n-1))
    dst=$n
    if [ -d /backup/$src ];
    then {
    mv /backup/$src /backup/$dst;
    }
    fi;
    }
    ((n--))
done;

Если вы используете bash, вы захотите использовать [[ и ]] вместо того [ и ]. Это значительно упрощает сравнение, как вы делаете здесь.

Во-первых, что есть $nначальное значение?

Попробуй это:

ssh usr@host 'for n in {10..1}; do [[ -d /backup/$(($n-1)) ]] && /bin/mv /backup/$(($n-1)) /backup/${n}; done'

Это должно сработать. Предполагая, что ваш начальный номер 10. В зависимости от того, откуда берется $ n, это можно изменить. Заметь mv указан полный путь ... это потому, что когда вы выполняете удаленный сеанс в ssh, он имеет тенденцию не выполнять ваши .bashrc и .bash_profile, что означает, что у вас еще нет $ {PATH}. Возможно, есть способ обойти это, но я не знаю, что это такое.

Написано более читабельно:

for n in {10..1}
do
  if [[ -d /backup/$src ]]
  then
    /bin/mv /backup/$src /backup/$dst
  fi
fi

Поскольку вы выполняете его удаленно, я подумал, что будет проще в одной строке.

Поместите сценарий в файл на вашем локальном компьютере, например backup.sh и запустите удаленное выполнение следующим образом:

ssh user@remotehost < backup.sh

Это позволяет вам запускать сценарий на удаленном хосте, не копируя его на удаленный хост.

Я использую этот метод для сбор технических характеристик оборудования из удаленных систем.