【问题标题】:pass parameters to remote machine将参数传递给远程机器
【发布时间】:2015-04-21 11:28:02
【问题描述】:

我希望能够将参数传递给远程机器。 在这个脚本中,我想根据权限对远程目标机器上的一些文件进行 chmod,我在源机器的相同文件上找到这些文件。

如果目标机器是我运行脚本的同一台机器,它对我有用(代码的 chmod $perm $path 部分有效)。 如果我尝试在远程机器上 chmod 文件,它不起作用(ssh root@"${destnode}" chmod $perm $path)。

还有一个问题。此脚本无法处理文件/文件夹名称中的空格。谁能帮我解决这个问题?

#!/bin/bash
sourcenode=$1
destnode=$2
path1=/root/test
tmp=/tmp/file-list

ssh root@"${sourcenode}" "find ${path1} -exec stat -c '%a %n' {} \; " > $tmp
cat $tmp | ssh root@"${destnode}" 'cat - > /tmp/file-list '
ssh root@"${destnode}"  cat $tmp |
while read perm path
do
    #ssh root@"${destnode}" chmod $perm $path
    chmod $perm $path
done

【问题讨论】:

  • “处理[ing]空格”的答案是在使用变量时引用它们。你已经为"${destnode}" 这样做了。当你运行ssh 版本的命令时会发生什么?你有错误吗?
  • 带引号的技巧适用于带空格的名称:)。谢谢。不,我没有收到任何错误。看起来,当我尝试将变量($perm 和 $path)传递给远程机器时,变量($perm 和 $path)变空了。

标签: bash parameters host


【解决方案1】:

这里的问题是您尝试直接通过 ssh 运行 bash 代码。您无需将文件列表复制到目标位置,因为您在运行脚本的主机上拥有所需的所有信息。

关于文件名空间问题,我使用 sed 解决了这个问题,将权限和文件之间的空格替换为 ':',然后在 while 循环中设置适当的 IFS(字段分隔符):

#!/bin/bash
sourcenode=$1
destnode=$2

path1=/root/test
tmp=/tmp/file-list

ssh root@$sourcenode \
        "find $path1 -exec stat -c '%a %n' {} \; | sed -e 's/^\([0-9]*\) \(.*\)$/\1:\2/'" > $tmp
while IFS=$':' read perm path; do
    ssh root@$destnode chmod $perm $path
done < $tmp

【讨论】:

  • 它不起作用 olopopo。脚本仍然无法将参数传递给远程机器。
  • : 是文件名中的合法字符。这使它成为分隔符的错误选择。这就是为什么 GNU find 有-print0。您不将文件发送到${destnode} 是绝对正确的,尽管这完全没有意义且代价高昂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-19
  • 1970-01-01
  • 2022-01-19
相关资源
最近更新 更多