Linux shell脚本,用于循环、ssh和别名

Linux shell脚本,用于循环、ssh和别名,linux,bash,shell,Linux,Bash,Shell,我正在尝试这样做,我需要从4个刀片服务器获取备份 所有数据都应存储在/home/backup/esa位置下,该位置包含4个 具有节点名称的目录(如sc-1、sc-2、pl-1、pl-2)。每个 目录应包含各自节点的备份信息 但是我看到“我从哪个节点执行命令,只有数据被保存。” 复制到所有4个目录”。知道为什么会这样吗?我的剧本是这样的: for node in $(grep "^node" /cluster/etc/cluster.conf | awk '{print $4}'); do ech

我正在尝试这样做,我需要从4个刀片服务器获取备份 所有数据都应存储在
/home/backup/esa
位置下,该位置包含4个 具有节点名称的目录(如sc-1、sc-2、pl-1、pl-2)。每个 目录应包含各自节点的备份信息

但是我看到“我从哪个节点执行命令,只有数据被保存。” 复制到所有4个目录”。知道为什么会这样吗?我的剧本是这样的:

for node in $(grep "^node" /cluster/etc/cluster.conf | awk '{print $4}');
do echo "Creating backup fornode ${node}";
ssh $node source /etc/profile.d/bkUp.sh;
asBackup -b /home/backup/esa/${node};
done

你的问题的格式有点混乱,但看起来你有引用问题。如果你这样做

ssh $node source /etc/profile.d/bkUp.sh; esaBackup -b /home/backup/esa/${node}
然后在
$node
上执行命令
source
。命令完成后,关闭远程连接,并使用它关闭包含寻源结果的shell
/etc/profile.d/bkUp.sh
。现在,
esaBackup
命令在本地计算机上运行。在'bkUp.sh中看不到你保存的任何东西

您需要做的是在希望远程shell运行的所有命令周围加上引号,比如

ssh $node "source /etc/profile.d/bkUp.sh; esaBackup -b /home/backup/esa/${node}"

这将使ssh在远程节点上运行完整的命令列表。

您的问题在于这段代码:

ssh $node source /etc/profile.d/bkUp.sh;
asBackup -b /home/backup/esa/${node};
它是:

  • $node
  • 在远程shell中执行命令
    source/etc/profile.d/bkUp.sh
  • 关闭远程shell并忘记在该shell中执行的任何操作
  • 在本地主机上运行
    asBackup
  • 这不是你想要的。将其更改为:

    ssh "$node" "source /etc/profile.d/bkUp.sh; asBackup -b '/home/backup/esa/${node}'"
    
    这是:

  • $node
  • 执行命令source/etc/profile.d/bkUp.sh;远程主机上的asBackup-b'/home/backup/esa/${node}'
  • 确保
    /home/backup/esa/${node}
    是NFS装载(否则,文件将仅备份到远程主机上的目录中)

    请注意,
    /etc/profile
    对于备份脚本(或其配置)来说是一个非常糟糕的地方。考虑将安装/配置移动到代码> > /home/备份/ESA < /代码>,这是(或应该)在集群的所有节点之间共享的,所以在一个地方更改它同时更新它。

    还要注意引号的用法:单引号和双引号确保变量
    节点中的空格不会导致意外问题。当然,“$node”中不太可能有空格,但如果有,错误消息会误导您


    因此,请始终正确引用。

    请仔细检查我是否正确编辑了您的脚本。标点符号很重要,我猜
    标记应该放在哪里。你为什么要源代码
    /etc/profile.d/bkUp.sh
    ?@AaronDigulla:bkUp.sh包含asBackup命令的别名。它不起作用,现在出现错误“esaBackup:command not found”" ... 有什么帮助吗@Rolandwell,你想通过ssh远程运行什么命令?您的问题很难理解,可能是我输入了错误的命令名。@user1081026:最好使用asBackup的完整路径/$中节点的bin/bash(grep“^node”/cluster/etc/cluster.conf | awk'{print$4}');执行echo“为节点${node}创建ESA备份”;ssh$node“source/etc/profile.d/esa.sh;esaBackup-b/home/backup/esa/${node};”完成;执行此脚本后,我在为节点sc-1创建ESA备份时遇到错误bash:esaBackup:command not found为节点sc-2创建ESA备份bash:esaback:command not found@Rolandi尝试为asBackup提供完整路径,我现在遇到不同的错误。为节点sc-1创建ESA备份[错误]无法确定环境变量“ESAHOMEINSTALL”。正在为节点sc-2创建ESA备份[错误]无法确定环境变量“ESAHOMEINSTALL”。正在为节点pl-1创建ESA备份[错误]无法确定环境变量“ESAHOMEINSTALL”。为节点pl-2创建ESA备份[错误]无法确定环境变量“ESAHOMEINSTALL”@PauloScardineNo它仍然不工作,我尝试了相同的命令,但仍然没有找到备份命令错误我得到!!!!“bash:asaBackup:command未找到”什么是asaBackup?请注意,在运行远程shell时,可执行搜索路径可能会减少。如果有疑问,请使用绝对路径调用该命令。很抱歉,这是ESABack,但问题是我无法使用绝对路径!!!我必须做一个来源。。。从最近两天开始,它就开始吞噬我的脑袋……在
    bkUp.sh
    中设置一个变量,其中包含路径(比如
    BACKUP\u HOME
    ),然后用
    调用它“$BACKUP\u HOME/esaBackup”
    ,或者确保
    $BACKUP\u HOME
    位于
    路径中。