【发布时间】: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 次,等于主机数量 -
你不应该使用全大写的变量名,比如
NAS、NAS2和HOSTNAME。有许多全大写名称(包括HOSTNAME)对 shell 和/或其他实用程序具有特殊含义,并且将它们重用于其他用途可能会导致麻烦。因此,使用小写或混合大小写的变量名来避免冲突是最安全的。