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

Запустить сценарий Bash на другом сервере

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

Когда я запускаю сценарий, каталоги переименовываются на сервере 1. Но каталоги не найдены на сервере 2.

В чем может быть ошибка в скрипте?

Скрипт;

#!/bin/bash

mach_directory=/home/user/example
erase_dir1=cache
erase_dir2=tmp


for i in {0..10}
do
    user=user
    server=$(ssh $user@server$i hostname)

        ssh $user@$server find $mach_directory -type d -name $erase_dir1 ! -path "*Admin/$erase_dir1*" -print0 | while IFS= read -r -d '' file ; do mv "$file" "${file}_$(date +%d%m%Y)"; done

        ssh $user@$server find $mach_directory -type d -name $erase_dir2 ! -path "*Admin/$erase_dir2*" -print0 | while IFS= read -r -d '' file ; do mv "$file" "${file}_$(date +%d%m%Y)"; done
done

РЕДАКТИРОВАТЬ: Я поменял кавычки местами.

Цитируйте команду после аргументов ssh

ssh $user@$server "find $mach_directory -type d -name $erase_dir1 ! -path '*Admin/$erase_dir1*' -print0 | while IFS= read -r -d '' file ; do mv '$file' '${file}_$(date +%d%m%Y)'; done"

(и я изменил кавычки с двойных на одинарные внутри строки.)

Вам либо нужно сделать МНОГО экранирования там, поскольку большая часть вашего кода выполняется локально, на машине, на которой вы запускаете скрипт, либо поместите весь этот скрипт после «ssh $ user @ $ server» в файл, скопируйте его ко всем серверам и выполнить.

Также вы можете взглянуть на параллельный ssh.

РЕДАКТИРОВАТЬ:

Все, что имеет в этом случае $, а также каналы и равные, будет выполняться локально на машине, на которой вы запускаете скрипт. Это означает, что он будет выполнять только команду find на удаленном компьютере, а остальную часть сценария локально.