Писался на коленке при помощи гугла. Цель была зарезервировать список папок и список БД mysql с одного хоста.
#!/bin/bash ##################### config dirs_to_save="/home/ci1.loc /home/smarty /home/TTT" my_dir_for_backups="/home/captain/backups" mysql_databases_to_save="content mysql test" mysql_user_name="root" ##################### /config target_dir=`date +%F` backup_dir="$my_dir_for_backups/$target_dir/" echo " ------------------------------------------------------------------- ijin reserv_copy script v.1.1 | Wed 02 Sep 2009 02:53:30 PM MSD hello at: "`date`" i'll save dump to: "$backup_dir" ------------------------------------------------------------------- " # create dir for current dump mkdir -p $backup_dir echo "dumping directories: --------------------" # pack all src dirs for cur_dir in $dirs_to_save; do dst_file=${cur_dir//\//-} # change slashes to - dst_file=$backup_dir${dst_file/-/}".tar.gz" # remove first - and create full dst file name echo $cur_dir" -> "$dst_file tar -czf $dst_file $cur_dir &> /dev/null # no output from tar done read -s -p " enter pass for mysql please: " MYSQL_PASS echo " dumping databases: ------------------" # pack all src databases for cur_db in $mysql_databases_to_save; do dst_file=$backup_dir$cur_db".sql" echo $cur_db" -> "$dst_file mysqldump -u $mysql_user_name --password=$MYSQL_PASS $cur_db > $dst_file 2> /dev/null ### hide error messages if [ $? != 0 ] ### result of execution of mysqldump then echo "=> WARNING: can't dump database. Check login:pass and privileges." unlink $dst_file else echo "=> OK: "$cur_db" dumped ok. I'll gzip it now.." gzip $dst_file fi done echo " ------------------------------------------------------------------- all done. bye at: "`date`" " sleep 1Естественно прав на папки и базы у пользователей должно хватать. Вывод будет примерно такой:
REM plink -N -L local_port:remote_localhost:remote_port remote_host_user@remote_host
plink -N -L 4500:localhost:3306 lala@lala-host.ru
Где:
- lala - имя юзера
- lala-host.ru - ваш хост
- -N - не стартовать шелл, коммандная строка не нужна
- -L - [listen-IP:]listen-port:host:port форвард локального порта на удаленный адрес
ssh -N -f -L local_port:remote_localhost:remote_port remote_host_user@remote_host
В примере мы вешаем на свою локальную машину, на порт 4500 коннект к удаленному 3306 порту мускуля через ssh соединение. Потом берем любой клиент для бд и подключаемся к локалхосту на порт 4500. И все дела. Естественно должен быть шелл-доступ к удаленному хосту с мускулем и plink должен оставаться запущенным и авторизованным на время работы с бд.
Как? Погуглив... Нашел. Оказалось совсем несложно, как обычно..
# для директорий используем -type dХороший человек объяснил подробности. ";" - терминатор екзека и шелла одновременно, поэтому его в шелле надо заэксейпить. Ну а "{}" результат файнда построчно.
cd /home/target_dir
find . -type d -exec chmod 755 {} \;
# для файлов -type f
cd /home/target_dir
find . -type f -exec chmod 644 {} \;
# по маске имени с параметром -name
cd /home/target_dir
find . -type f -name '*.htm*' -exec chmod 644 {} \;
# для наглядности можно выполнить
find /home/target_dir/ -type f -name '*.php' -exec echo '-- '{} \;
Простенько двигаемся по папочкам и просто так считаем чего сколько. Для *nix придется сменить слеш в пути. А работать всё равно будет.
import os # settings: src dir sSrc='d:\\Install' def show_all(sSrc,iDirs=0,iFiles=0): for file in os.listdir(sSrc): # full pathname file=os.path.join(sSrc,file) if os.path.isdir(file): # if directories print '['+file+']' iDirs+=1 iDirs,iFiles=show_all(file,iDirs,iFiles) else: # else files print ' '+file iFiles+=1 return iDirs,iFiles iDirs,iFiles=show_all(sSrc,0,0) print """ total dirs: """,iDirs,""" total files: """,iFiles
Если при попытке выполнить скрипт, мы видим что-то вроде.. "ImportError: No module named image" Сие озночает что надобно установить PIL. А как? А очень просто!
# для убунту sudo apt-get install python-imagingНу а для win придется сползать на оф страничку, скачать и установить соответствующую версию PIL.