Задача: несколько серверов и один комп-архиватор, на котором нужно делать бекап "избранных" файлов. На каждом сервере создаем юзера archiver (ну или какой вам нравиться). В домашнем каталоге у него (на каждом же сервере) создаем папочку backup (ну или какое название вам нравиться другое). Также создаем скрипт, который кроном запускается с нужной периодичностью и пакует в эту папку нужный вам контент.
На компе-архиваторе создаем папку backups с подкаталогами у которых имена сопадают с именами архивируемых серверов. Далее устанавливаем утилиту expect на компе-архиваторе и пишем скрипт такого содержания:
#!/usr/bin/expect -f
set ret [ catch {
array set user {
server_1 archiver
server_2 archiver
# etc
server_n archiver
}
#можно и без этого абзаца, но вдруг find на серверах находится в разных местах
array set find {
server_1 /usr/bin/find
server_2 /usr/bin/find
# etc
server_n /usr/bin/find
}
array set ips_passwords {
server_1 password1
server_2 password2
# etc
server_n passwordn
}
set timeout -1
send_user "backup is starting!...\n"
foreach keyip [array name ips_passwords] {
#
#Копируем периодические бэкапы на наш комп-архиватор
spawn /usr/bin/scp $user($keyip)@$keyip:/home/$user($keyip)/backup/* /home/backuper/backups/$keyip
match_max 100000
expect "*?assword*:"
send -- "$ips_passwords($keyip)\r"
send -- "\r"
expect eof
#
#Со следующим абзацем поосторожней. Удаляет в директории, где храняться
#наши бэкапы файлы старше 5 дней.
spawn /usr/bin/ssh $user($keyip)@$keyip $find($keyip) /home/$user($keyip)/backup -ctime +5 -exec /bin/rm \{\} \\\;
match_max 100000
expect "*?assword*:*"
send -- "$ips_passwords($keyip)\r"
send -- "\r"
expect eof
}
send_user "backup had finished succesfully!\n"
} result ]
set fh [open /home/backuper/Desktop/expect-works w]
puts $fh "Code $ret, Message/Result $::result \n"
close $fh
Нюанс. Сделайте, если еще не делали, логин юзером archiver с вашего компа-архиватора через ssh на каждый сервер. Эту ситуацию (первая сессия ssh archiver@server_x) можно отработать и в скрипте, но тогда код усложниться. А нам нужна проcтота. Не так ли?