我正在尝试使用脚本(底部)将DIR从一台服务器同步到100台服务器
但是,当我在${host}
变量周围加上单引号或双引号时,主机名无法正确选择或无法解析。
错误如下所示
server1.example.com
Host key verification failed.
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(600) [sender=3.0.6]
,并且当我仅使用rync
命令运行时,它可以工作。但是,输出不包含主机名,这对于我将输出与关联的主机名关联起来很重要。
hostname -f && rsync -arpn --stats /usr/xyz ${host}:/usr/java
能否请您回顾并建议我如何使脚本即使在Host变量周围加引号也能正常工作。 ?
因此,输出将包含主机名和rsync的输出。
============================================= < / p>
#!/bin/bash
tmpdir=${TMPDIR:-/home/user}/output.$$
mkdir -p $tmpdir
count=0
while IFS= read -r host; do
ssh -n -o BatchMode=yes ${host} '\
hostname -f && \
rsync -arpn --stats /usr/xyz '${host}':/usr/java && \
ls -ltr /usr/xyz'
> ${tmpdir}/${host} 2>&1 &
count=`expr $count + 1`
done < /home/user/servers/non_java7_nodes.list
while [ $count -gt 0 ]; do
wait $pids
count=`expr $count - 1`
done
echo "Output for hosts are in $tmpdir"
exit 0
更新:
基于对(set -x)的观察,主机名正在其自身的远程(self)上解析,应该在启动主机上解析。我想,一旦知道了如何在引号到位的情况下使用主机名来解析主机名。
答案 0 :(得分:0)
据我所知,您正在寻找的东西是这样的:
#!/bin/bash
tmpdir=${TMPDIR:-/home/user}/output.$$
mkdir -p "$tmpdir"
host_for_pid=( )
while IFS= read -r host <&3; do
{
ssh -n -o BatchMode=yes "$host" 'hostname -f' && \
rsync -arpn --stats /usr/xyz "$host:/usr/java" && \
ssh -n -o BatchMode=yes "$host" 'ls -ltr /usr/java'
} </dev/null >"${tmpdir}/${host}" 2>&1 & pids[$!]=$host
done 3< /home/user/servers/non_java7_nodes.list
for pid in "${!host_for_pid[@]}"; do
if wait "$pid"; then
:
else
echo "ERROR: Process for host ${host_for_pid[$pid]} had exit status $?" >&2
fi
done
echo "Output for hosts are in $tmpdir"
请注意,rsync
不再位于ssh
命令中,因此它在本地而非远程运行。