#!/bin/bash
sourcenode=$1
destnode=$2
path1=/root/test
ssh root@"${sourcenode}" -t "echo "${path1}" | xargs -IDIR find DIR " |
while read line
do
ssh root@"${sourcenode}" -t "stat -c "%a" $line | xargs -IDIR ssh root@"${destnode}" chmod DIR $line"
done
该脚本应该仅在两台远程计算机(源计算机和目标计算机)之间复制权限。在源计算机和目标计算机上,有一个/root/test/
包含少量文件的文件夹 ( )。由于某种原因,在第一行读取它\r
在末尾添加的内容。我尝试了一些方法来摆脱它,但没有效果。
我收到这个错误。
Pseudo-terminal will not be allocated because stdin is not a terminal.
stat: cannot stat `/root/test\r': No such file or directory
答案1
哦,亲爱的,带有循环和无用 xargs 的三重 ssh 管道,您发现了最糟糕的方法。
您\r
看到的似乎是穿过管道的换行符的剩余部分。您应该删除该-t
选项,它可能是导致您的问题的原因。在虚拟终端中显示的输出与普通流不同。
而且,echo ${path1} | xargs
完全是多余的,只要运行find ${path1}
,你就只有一根输入线xargs
。第二个也是同样的情况xargs
。当然,你可以把所有东西都放进去find
。尝试:
ssh root@"${sourcenode}" "find ${path1} -printf 'chmod %m \"f\"\n'"
并将其输入到下一个命令中(不是进入本地 bash 循环,但将其直接输入 ssh 到目标节点)。