我希望bash脚本读取文件并执行rsync,引用该文件的logindetails。 我有一个单独的文件,其中包含所有服务器的登录详细信息。
我想使用以下格式:
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文件中获取所有数据并将rsync分别发送给其他人? 示例rsync脚本:
source serverlist
sshpass -p $pwd rsync -av --delete $user@$ip:$rpath /home/backup/$lpath
我认为这必须通过循环完成,但我不知道如何告诉bash将每台服务器接连不断
感谢您的帮助!
答案 0 :(得分: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