在另一个服务器上运行 Bash 脚本

在另一个服务器上运行 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

答案1

您要么需要在其中进行大量转义,因为您的大部分代码都是在运行脚本的机器上本地执行的,要么将所有脚本放在“ssh $user@$server”之后的文件中,将其复制到所有服务器并执行它。

另外,你可能想看看并行 ssh

编辑:

在这种情况下,所有带有 $ 的命令以及管道和等号都将在运行脚本的机器上本地执行。这意味着它将只在远程计算机上执行 find 命令,并在本地执行脚本的其余部分。

答案2

编辑:我已交换引号。

在 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"

(并且我将字符串中的双引号改为单引号。)

相关内容