如何循环通过一组ip地址来获取bash中每台机器的主机名?

如何循环通过一组ip地址来获取bash中每台机器的主机名?,bash,backup,rsync,Bash,Backup,Rsync,我正在尝试编写一些简单的bash脚本,我想创建一个备份脚本,它将使用rsync获取预定的目录,并将它们同步到备份机器。代码如下: #!/bin/bash #Specify the hosts ip=(192.168.1.40 192.168.1.41 192.168.1.42 192.168.1.43) #currently unused webdirs=(/etc/nginx/sites-available/ /var/www/ghost) #Directory to store ever

我正在尝试编写一些简单的bash脚本,我想创建一个备份脚本,它将使用rsync获取预定的目录,并将它们同步到备份机器。代码如下:

#!/bin/bash


#Specify the hosts
ip=(192.168.1.40 192.168.1.41 192.168.1.42 192.168.1.43)
#currently unused
webdirs=(/etc/nginx/sites-available/ /var/www/ghost)
#Directory to store everything
NAS=/mnt/synology/Torrents/Games/


#Remote-hosts to rsync from
for i in "${ip[@]}"
do
HOSTNAME=$(hostname)
NAS2=$HOSTNAME$NAS
  if [ ! -d "$NAS2" ]; then
    echo $NAS2 "does not exist, creating..."
    mkdir -p $NAS2
  else
    echo "inside the else"
    sudo rsync -anvzP -e "ssh -i $HOME/.ssh/id_rsa" victor@$i:/etc  $NAS2/
  fi
done;
还没做完,但我遇到了一个问题。我不知道如何为每台机器创建新目录。现在它只为我的web服务器创建目录

编辑:我通过使用ssh和命令替换解决了这个问题,我所做的只是:

HOSTNAME=$(ssh user@$i "hostname")

变量$HOSTNAME将在每次迭代后更改。正是我想要的。

是您想要的输出如下:

$host/mnt/synology/Torrents/Games/
其中,
$host
是每个IP的名称:(192.168.1.40 192.168.1.41 192.168.1.42 192.168.1.43)

mkdir
构建路径时,您正在执行
$(主机名)
,但该命令的输出将是您的本地计算机名;它不会在每个主机上运行


如果需要每个主机名,则应在每个IP中通过ssh启动该命令并检索输出。

不确定问题出在哪里。你的循环终止得太早了吗?尝试将
-n
选项添加到
ssh
@codeforester这是我将-n参数添加到ssh时得到的输出<代码>victor@webserver:~$./backup.sh skapar mapp rsync:连接意外关闭(到目前为止接收到0字节)[发送方]rsync错误:io.c(226)处的rsync协议数据流(代码12)中出错。[发送方=3.1.1]rsync:连接意外关闭(到目前为止接收到0字节)[接收方]rsync error:io.c(226)[Receiver=3.1.1]的rsync协议数据流(代码12)中出现错误很抱歉,我不知道如何在注释中格式化代码。。这种情况发生4次,相当于主机数量您不应使用所有caps变量名,如
NAS
NAS2
HOSTNAME
。有许多对shell和/或其他实用程序具有特殊意义的所有caps名称(包括
主机名
),如果将它们用于其他用途,可能会带来麻烦。因此,使用小写或混合大小写的变量名是最安全的,以避免冲突。