1

bash スクリプトがファイルを読み取り、ファイルの logindetails を参照して 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 に答える