代码之家  ›  专栏  ›  技术社区  ›  user2933212

Bash-服务器的rsync列表

  •  1
  • user2933212  · 技术社区  · 11 年前

    我希望bash脚本读取一个文件,并引用该文件的logintails执行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/
    

    请有人告诉我如何正确地循环主脚本,从logintails文件中grep所有数据,并相互进行rsync? rsync脚本示例:

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

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

    谢谢你的帮助!

    1 回复  |  直到 11 年前
        1
  •  1
  •   Rafa Viotti aiwiguna    11 年前

    您可以使用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.
    

    您可以使用 获取选择 ,但要复杂得多。

    更新2

    如果您需要使用 获取选择 ,然后转换 远程同步 将脚本的一部分转换为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
    }
    

    然后,您可以使用 获取选择 选项作为参数。

    do_sync $getopt_option