Online video hd

Смотреть фильмы бесплатно

Официальный сайт all-remont 24/7/365

Смотреть видео бесплатно

uscr 08.07.2011 22:02

СкриптыСкрипт без названия, который никому не нужен.

Здравствуйте!
Прошу не обсуждать стиль ведения разработки сайта, о котором пойдет речь - в данном случае всё довольно плохо.
Отнеситесь с юмором.

Начну, как обычно, с предыстории:
есть у нас некоторый проект. Речь пойдёт о веб-сайте этого проекта. В каталоге, в котором лежит этот сайт, много программистов правят различные скрипты (php, perl), дизайнеры заливают новые картиночки. Многие части этого веб-сайта перетащены из других проектов. Итог - сумасшедшая помойка прав на файлы и владельцев файлов. Причём приводить это в порядок - задача не такая уж и тривиальная (хотя, на самом деле, всем просто лень). Многие скрипты, например, работают из-под юзера foo группы bar, а логи пишут в файл, хозяин которого egg из группы spam, а в этот лог пишет ещё и скрипт от имени monroe из группы spam. На самом деле, я привёл плохой пример. Но суть, я думаю, ясна. Неожиданно возникла идея этот проект перевести в git. Проблема в том, что при разворачивании сайта из git'а все файлы станут принадлежать юзеру, из-под которого развёрнут репозиторий. Таким образом, встала необходимость "забекапить" права на файлы. В связи с этим и был написан скрипт.

Как работает?



Скрипт получает вывод команды ls -laR в файл в /tmp, который затем удалит за собой.
Затем он построчно читает полученный файл и парсит каждую строку. Из строки он получает имя файла, права на файл, владельца и группу файла. Кроме того, скрипт "знает" в каком каталоге лежат файлы, с которыми он сейчас работает, так что проблем не будет. На выходе скрипт выплёвывает готовый shell скрипт с перечнем команд chmod и chown. Поэтому, рекомендую передавать скрипту абсолютный путь к каталогу, права которого хотите "забекапить"-так будет проще потом пользоваться полученным скриптом.


Как запускать?



Вот так:
1
lslarparser.sh /some/path ~/somepath_rules_backup.sh


или так:
1
lslarparser.sh /some/path ~/somepath_rules_backup.sh "RUS"



Опция RUS появилась от того, что в разных локалях разный вывод ls -la.
В буржуйской локали он выглядит так:

drwxr-xr-x 3 root root 4096 2011-05-05 03:56 backup_20110503

а в отечественной так:

-rw-r--r-- 1 nazarovd users 2457260 Апр 26 23:00 backup_20110503

Два лишних пробела ломают всю стройную систему.
Если у вас начнутся глюки - подберите значение под себя. Для этого нужно делать в консоли так:
echo `ls -la somefile`|cut -d ' ' -f9
вместо цифры "9" подставляйте свою, пока не получите имя файла. Затем полученную цифру подставьте в скрипт в выражение let LS_DATE_SPACES=

Скрипт написан под bash. Насколько я знаю, в других оболочках могут быть проблемы с нарезанием строк.
Собственно, сам скрипт:
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#!/bin/bash

WORK_DIR=$1
SCRIPT_PATH=$2

TMP_FILE_NAME=$(echo /tmp/`date +%s`.tmp)


if [ -z $3 ]; then
let LS_DATE_SPACES=8
elif [ "$3" = "RUS" ]; then
let LS_DATE_SPACES=9
fi

echo '#!/bin/bash'>$SCRIPT_PATH
echo "# created at `date` for $WORK_DIR">>$SCRIPT_PATH
echo "">>$SCRIPT_PATH

calculator()
{
string=$1
one=${string:0:1}
two=${string:1:1}
three=${string:2:1}
let res=0

for i in $one $two $three
do
if [ "$i" = "r" ]; then
let res=res+4

elif [ "$i" = "w" ]; then
let res=res+2

elif [ "$i" = "x" ]; then
let res=res+1
elif [ "$i" = "-" ]; then
donothing="pass"
else
echo "FATAL ERROR!"
exit 1
fi
done
echo $res
}

chmodemaker()
{

rawline=$1
u=${rawline:1:3}
g=${rawline:4:3}
a=${rawline:7:3}

ru=`calculator $u`
rg=`calculator $g`
ra=`calculator $a`

compilation=$ru$rg$ra

echo $compilation
}

touch $TMP_FILE_NAME
ls -laR $WORK_DIR > $TMP_FILE_NAME

while read line;
do

if [ "${line:0:1}" = "." -o "${line:0:1}" = "/" ];
then
nowpath=`echo $line|sed 's/://g'|sed 's/\/$//g'|sed 's/\/\//\//g'`
fi
if [ "${line: -1}" != "." -a "${line: -1}" != ".." ]; then

if [ "${line:0:3}" = "drw" -o "${line:0:3}" = "dr-" -o "${line:0:3}" = "d-w" -o "${line:0:3}" = "d--" -o "${line:0:3}" = "-rw"\
-o "${line:0:3}" = "--w" -o "${line:0:3}" = "-r-" -a "${line:0:3}" != "." ]; then
stripline=`echo $line|sed 's/[ ]+/ /g'`
rules=`echo $stripline|cut -d ' ' -f1`
owner=`echo $stripline|cut -d ' ' -f3`
group=`echo $stripline|cut -d ' ' -f4`
mode=`chmodemaker $rules`

filename=`echo $stripline|cut -d ' ' -f$LS_DATE_SPACES`
echo "chmod $mode $nowpath/$filename" >> $SCRIPT_PATH
echo "chown $owner:$group $nowpath/$filename" >> $SCRIPT_PATH
fi
fi

done < "$TMP_FILE_NAME"

rm -f $TMP_FILE_NAME


Результат



Запускаю:
1
./lslarparser.sh /home/nazarovd /tmp/test.sh "RUS"



Получаю:

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
cat /tmp/test.sh 
#!/bin/bash
# created at Птн Июл 8 21:54:23 MSD 2011 for /home/nazarovd

chmod 644 /home/nazarovd/137755-London
chown nazarovd:users /home/nazarovd/137755-London
chmod 644 /home/nazarovd/54250-MurrinaRelaxV0-5.tar.bz2
chown nazarovd:users /home/nazarovd/54250-MurrinaRelaxV0-5.tar.bz2
chmod 644 /home/nazarovd/56438-aurora-1.5.1.tar.bz2
chown nazarovd:users /home/nazarovd/56438-aurora-1.5.1.tar.bz2
chmod 700 /home/nazarovd/.adobe
chown nazarovd:users /home/nazarovd/.adobe
chmod 644 /home/nazarovd/anketa_new_14u.pdf
chown nazarovd:users /home/nazarovd/anketa_new_14u.pdf
chmod 755 /home/nazarovd/aur-gtk-elegant-aurora-theme
chown nazarovd:users /home/nazarovd/aur-gtk-elegant-aurora-theme
chmod 600 /home/nazarovd/.bash_history
chown nazarovd:users /home/nazarovd/.bash_history
chmod 644 /home/nazarovd/.bash_profile
chown nazarovd:users /home/nazarovd/.bash_profile
chmod 644 /home/nazarovd/.bashrc
...
и т.д.



Тэги: chmod chown rule дураки дороги
+ 2 -
Похожие Поделиться

lockie 08.07.2011 22:51 #
+ 3 -
> который никому не нужен
Скрипт-социопат? :)
uscr 09.07.2011 00:36 #
+ 1 -
Ну а где его можно применить, кроме как в подобной говноразработке?
Нужно искоренять подобный подход, а не писать скрипты.
mealsforall 09.07.2011 01:00 #
+ 1 -
Чтобы не бороться с локалями и LC_DATE_SPACES, можно или указать свою переменную среды LC_DATE в скрипте, или указать ls параметр --time-style=STYLE, например.

А зачем touch $TMP_FILE_NAME в строке 64? Stdout redirection в 65 сделает файл самостоятельно.

Вместо калькулятора достаточно сделать stat $filename и прочитать цифровой код в строке Access. Там же и uid/gid есть.

В целом получать список файлов при помощи ls очень странно. Обычно делают find . -print | xargs блабла.

В общем, идея бэкапа прав интересная, но скрипт можно улучшить в сто раз.
mealsforall 09.07.2011 01:04 #
+ 0 -
Тэг записи рулит :)

А что, в самом примере скрипт сломался? Почему home-ome вот это:
/home/nazarovd/ome/nazarovd/ ?
mealsforall 09.07.2011 01:07 #
+ 1 -
ЗЫ. А suid/sgid/sticky bit как же? :)
mealsforall 09.07.2011 01:10 #
+ 0 -
ЗЗЫ. Git умеет сохранять права на файлы, кстати. Команды git-cache-meta --store и git-cache-meta --apply.
uscr 09.07.2011 01:21 #
+ 0 -
Владельца не умеет же всё равно.
Да и пятница же! Не работу же работать было :)
uscr 09.07.2011 01:21 #
+ 0 -
Жду продвинутой версии :Р
uscr 09.07.2011 01:21 #
+ 0 -
Потому что это реально существующий путь :)
uscr 09.07.2011 01:29 #
+ 1 -
Я плохой!
И правда сломался...
uscr 09.07.2011 01:31 #
+ 0 -
Блин! Да он не рабочий! Кудаж я смотрел?
Сейчас поправим.
uscr 09.07.2011 01:47 #
+ 0 -
Поправил, но надеюсь, этого никто не увидит.

echo $line|sed 's/://g'|sed 's/\/$//g'|sed 's/\/\//\//g'
uscr 09.07.2011 01:22 #
+ 0 -
Буду рад увидеть продвинутую версию. Это написано за 10 минут + 5 минут на исправление ошибок.
mealsforall 09.07.2011 02:31 #
+ 1 -
Вот, например.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
WORK_DIR=$1
TMP_FILE_NAME=$2

for file in $(find . -print) 
do
  modes=$(stat $file | grep "Uid")
  permissions=$(echo $modes | awk ' BEGIN { FS="[(/) ]*"}; {print $2};')
  owner=$(echo $modes | awk ' BEGIN { FS="[(/) ]*"}; {print $6};')
  group=$(echo $modes | awk ' BEGIN { FS="[(/) ]*"}; {print $9};')
  echo "chmod $permissions $file" >>$TMP_FILE_NAME
  echo "chown $owner:$group $file" >>$TMP_FILE_NAME
done


mealsforall 09.07.2011 02:48 #
+ 0 -
гы, find $WORK_DIR -print, конечно.
?micier 09.07.2011 03:15 #
+ 3 -
1
2
3
4
5
6
7
#!/bin/bash
set -e
cd ${1:-.}
echo "#!/bin/sh"                                                                                                                                                          
echo "# Change mode for $HOSTNAME:$PWD back up to $(date -R)"                                                                                                             
find $PWD -printf 'chown %u:%g %p\nchmod %m %p\n\n'                                                                                                                       
cd -
mealsforall 09.07.2011 04:55 #
+ 0 -
О, годно!
?micier 09.07.2011 03:24 #
+ 0 -
mealsforall, замечу еще что:
а) вы забыли сменить тек. директорию на WORK_DIR;
б) вызывать стоит именно find $PWD или find $(pwd), как в моем варианте, поскольку иначе пути в генерируемом получаться относительными.
kstep 10.07.2011 00:41 #
+ 1 -
По поводу относительных/абсолютных путей спорный вопрос. Может оказаться, что относительные пути в данном случае предпочтительнее, т.к. сохраняются права и владельцы для файлов в гитовской репе. Может статься, что репа может быть склонирована и зачекаутена в совершенно другой каталог или на другой хост (например не в /home/production, а в /home/test, или вообще в склонированную виртуалку) и надо будет восстановить метаданные для файлов с совершенно другого корневого пути.
ananas 09.07.2011 11:20 #
+ 0 -
за подобный for и if elif в calculator надо бить ремнем по жопе. освойте наконец case ... esac, нафиг нужны $@ и что будет делать for без парметров
?micier 09.07.2011 12:32 #
+ 2 -
Мне кажется, что представленный скрипт является слишком целостным примером того, как не надо решать задачи при помощи шелла, поэтому критиковать его отдельные части бессмысленно.
ananas 09.07.2011 16:32 #
+ 0 -
не согласен. пофиг на ценность данного скрипта, но вот определенные техники, применяемые в скриптописании, и их правльное использование обсуждать всегда полезно
uscr 10.07.2011 13:10 #
+ 2 -
А чем это лучше, кроме усиления "правильности" кода? Это повлияет на быстродействие?

P.S.
Это серьёзный вопрос, а не из разряда "не учите меня жить".
cocucka 11.07.2011 12:43 #
+ 2 -
tar -zcvpf /backup/path.tgz /some/path

Делает то же самое что и ваш скрипт.
xT 11.07.2011 13:07 #
+ 0 -
acl?

Смотреть видео онлайн

Онлайн видео бесплатно


Смотреть русское с разговорами видео

Online video HD

Видео скачать на телефон

Русские фильмы бесплатно

Full HD video online

Смотреть видео онлайн

Смотреть HD видео бесплатно

School смотреть онлайн