shell脚本,for循环,ssh和别名

时间:2011-12-05 06:56:31

标签: 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 echo "Creating backup fornode ${node}";
ssh $node source /etc/profile.d/bkUp.sh;
asBackup -b /home/backup/esa/${node};
done

2 个答案:

答案 0 :(得分:1)

您的问题格式有点令人困惑,但看起来好像有引用问题。如果你这样做

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

然后在source上执行命令$node。命令完成后,远程连接将关闭,包含它的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运行远程节点上的完整命令列表。

答案 1 :(得分:1)

你的问题是这段代码:

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

它确实:

  1. $node
  2. 上创建一个远程shell
  3. 在远程shell
  4. 中执行命令source /etc/profile.d/bkUp.sh
  5. 关闭远程shell 并忘记在该shell中完成的任何操作!!
  6. 在本地主机上运行asBackup
  7. 这不是你想要的。将其更改为:

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

    这样做:

    1. $node
    2. 上创建一个远程shell
    3. 远程主机上执行命令source /etc/profile.d/bkUp.sh; asBackup -b '/home/backup/esa/${node}'
    4. 确保/home/backup/esa/${node}是NFS安装(否则,文件只会备份在远程主机上的目录中)。

      请注意,/etc/profile是备份脚本(或其配置)的一个非常糟糕的地方。考虑将setup / config移动到集群的所有节点之间(或应该)共享的/home/backup/esa,因此在一个地方更改它会立即更新它。

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

      所以总是要正确引用。

相关问题