【问题标题】:How do I loop through an array of ip adresses to get the hostname of each machine in bash?如何遍历一组 ip 地址以在 bash 中获取每台机器的主机名?
【发布时间】:2017-03-23 14:32:02
【问题描述】:

我正在尝试学习编写一些简单的 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;

这还没有完成,但我遇到了问题。我不知道如何为每台机器创建新目录。现在它只是为我的网络服务器创建目录。

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

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

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

【问题讨论】:

  • 不确定您的问题是什么。您的循环是否过早终止?尝试将-n 选项添加到ssh
  • @codeforester 这是我将 -n 参数添加到 ssh 时得到的输出。 victor@webserver:~$ ./backup.sh skapar mapp rsync: connection unexpectedly closed (0 bytes received so far) [sender] rsync error: error in rsync protocol data stream (code 12) at io.c(226) [sender=3.1.1] rsync: connection unexpectedly closed (0 bytes received so far) [Receiver] rsync error: error in rsync protocol data stream (code 12) at io.c(226) [Receiver=3.1.1] 对不起,我不明白如何在 cmets 中格式化代码。这种情况发生了 4 次,等于主机数量
  • 你不应该使用全大写的变量名,比如NASNAS2HOSTNAME。有许多全大写名称(包括 HOSTNAME)对 shell 和/或其他实用程序具有特殊含义,并且将它们重用于其他用途可能会导致麻烦。因此,使用小写或混合大小写的变量名来避免冲突是最安全的。

标签: bash backup rsync


【解决方案1】:

你想要的输出是这样的:

$host/mnt/synology/Torrents/Games/

$host 是每个 ip 的名称:(192.168.1.40 192.168.1.41 192.168.1.42 192.168.1.43) ?

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

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

【讨论】:

    猜你喜欢
    • 2014-04-12
    • 2012-05-31
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 2018-01-02
    相关资源
    最近更新 更多