linux - shell 脚本、for 循环、ssh 和别名

标签 linux bash shell

我正在尝试做这样的事情,我需要从 4 个 Blade 中获取备份,并且 所有都应该存储在 /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;
asBackup -b /home/backup/esa/${node};

确实如此:

  1. $node 上创建一个远程 shell>
  2. 在远程shell中执行命令source/etc/profile.d/bkUp.sh
  3. 关闭远程 shell 并忘记在该 shell 中所做的任何事情!!
  4. 在本地主机上运行 asBackup

这不是你想要的。将其更改为:

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

这样做:

  1. $node 上创建一个远程 shell>
  2. 执行命令source/etc/profile.d/bkUp.sh; asBackup -b '/home/backup/esa/${node}'远程主机上

确保 /home/backup/esa/${node} 是 NFS 挂载(否则,文件只会备份到远程 主机)。

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

另请注意引号的使用:单引号和双引号确保变量 node 中的空格不会导致意外问题。当然,"$node"中不太可能有空格,但如果有,错误消息会误导您。

所以总是正确引用。

关于linux - shell 脚本、for 循环、ssh 和别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8381938/

相关文章:

shell - 箭头键在 shell 中不起作用

在 sudo 中运行程序时将目录的所有权更改为用户

linux - 在 Linux 上用 perl fork 一个新进程

linux - 在 bash 函数名称末尾使用加号

bash - 使用命令行工具计算文件中的行长度

java - 无法将值从 Bash 脚本传递到 Java 程序

shell - 如何使用 Shell 脚本 grep 搜索词 (....) 旁边的词?

bash - [-d : command not found

linux - 如何在非阻塞套接字上处理 OpenSSL SSL_ERROR_WANT_READ/WANT_WRITE

linux - bash中的整数比较错误