1

我希望 bash 脚本读取文件并执行 rsync 引用文件的登录详细信息。我有一个单独的文件,其中包含所有服务器的登录详细信息。

我想使用以下格式:

server=1
type=openvz
ip=1.1.1.1
port=22
user=root
pwd=something
rpath=/home/private/
lpath=s1/

server=2
type=openvz
ip=1.1.1.2
port=22
user=root
pwd=something
rpath=/home/private/
lpath=s2/

请有人告诉我如何使主脚本正确循环以从 logindetails 文件中 grep 所有数据并使 rsync 彼此同步?rsync 脚本示例:

source serverlist
sshpass -p $pwd rsync -av --delete $user@$ip:$rpath /home/backup/$lpath

我认为这必须通过循环来完成,但我不知道如何告诉 bash 一个接一个地占用每个服务器

谢谢您的帮助!

4

1 回答 1

1

您可以使用 bash 索引数组来创建配置文件。

server[1]=1
type[1]=openvz
ip[1]=1.1.1.1
port[1]=22
user[1]=root
pwd[1]=something
rpath[1]=/home/private/
lpath[1]=s1/

server[2]=2
type[2]=openvz
ip[2]=1.1.1.2
port[2]=22
user[2]=root
pwd[2]=something
rpath[2]=/home/private/
lpath[2]=s2/

然后对其进行迭代。

source serverlist

for i in $(seq ${#server[@]}); do
    sshpass -p ${pwd[$i]} rsync -av --delete ${user[$i]}@${ip[$i]}:${rpath[$i]} /home/backup/${lpath[$i]}
done

希望能帮助到你。

更新

如果您希望能够在命令行上指定要同步的服务器,请使用 Bash 位置参数$1

source serverlist

if [ "$1" ]; then
    sshpass -p ${pwd[$1]} rsync -av --delete ${user[$1]}@${ip[$1]}:${rpath[$1]} /home/backup/${lpath[$1]}

else
    for i in $(seq ${#server[@]}); do
        sshpass -p ${pwd[$i]} rsync -av --delete ${user[$i]}@${ip[$i]}:${rpath[$i]} /home/backup/${lpath[$i]}
    done
fi

然后,使用可选的服务器编号作为第一个参数调用脚本。

./script.sh   # This would sync all servers in the config file. 
./script.sh 2 # This would sync only server number 2.

您可以使用getopt,但它要复杂得多。

更新 2

如果您需要使用getopt,则将脚本的rsync部分转换为 Bash 函数。

source serverlist

function do_sync() {
    if [ "$1" ]; then
        sshpass -p ${pwd[$1]} rsync -av --delete ${user[$1]}@${ip[$1]}:${rpath[$1]} /home/backup/${lpath[$1]}

    else
        for i in $(seq ${#server[@]}); do
            sshpass -p ${pwd[$i]} rsync -av --delete ${user[$i]}@${ip[$i]}:${rpath[$i]} /home/backup/${lpath[$i]}
        done
    fi
}

然后,您可以使用getopt选项作为参数调用此函数。

do_sync $getopt_option
于 2013-11-03T04:05:28.277 回答