引号中的变量未显示

时间:2018-10-15 20:51:56

标签: bash shell rsync

我正在尝试使用脚本(底部)将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)上解析,应该在启动主机上解析。我想,一旦知道了如何在引号到位的情况下使用主机名来解析主机名。

1 个答案:

答案 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命令中,因此它在本地而非远程运行。