chmod
Материал из Xgu.ru
Не указан параметр (1)
[править] Описание
Программная утилита, которая служит для изменения флагов модификаторов файла.
Модификаторы доступа или права доступа в Unix системах состоят из трех групп по три разряда. Первая группа описывает права владельца, вторая группы и третья всех остальных. Первый разряд доступ на запись, второй - чтение и третий на исполнение.
Примером числовой записи может служить '755', которая эквивалентна записанной выше строковой записи: каждое право имеет числовой код и может быть задано вручную:
- 400 — владелец имеет право на чтение;
- 200 — владелец имеет право на запись;
- 100 — владелец имеет право на выполнение;
- 40 — группа имеет право на чтение;
- 20 — группа имеет право на запись;
- 10 — группа имеет право на выполнение;
- 4 — остальные имеют право на чтение;
- 2 — остальные имеют право на запись;
- 1 — остальные имеют право на выполнение.
Суммировав эти коды можно получить символьную запись. Например, chmod 444 {имяфайла}: 400+40+4=444 — все имеют право только на чтение.
Также разрешается применение символьного указателя:
# chmod u+x file.txt
где u - право относительно пользователя, может принимать значения g - группа, a - все остальные, или вовсе отсутствовать, и тогда модификатор будет применен ко всем трём группам.
+ означает установку, соответственно сброс обозначен знаком -.
x - модификатор исполнения, r - чтение, w - запись.
[править] Пример
Чтобы передать права в формате ls -l (rwxrwxrwx) в качестве аргумента chmod их можно преобразовать при помощи простой функции:
rwx2dig() { ( echo ibase=2; echo obase=8; sed s/^.// | tr -- -rwx 01 ) | bc; }
Полученное число может использовать как аргумент для chmod:
# ls -l /etc/passwd | awk '{print $1}' | rwx2dig 644
# find /bin /boot /etc /initrd /lib /sbin /usr /var -ls \ | egrep -v "/usr/src" \ | awk '{print$3" "$11}' \ | sed 's/^.//' \ | while read var1 var2 do echo "chmod -v `(echo ibase=2; echo obase=8; echo $var1 \ | tr -- -rwxsStT 01 )|bc` \"$var2\" 1>> /tmp/log.perm 2>>/tmp/log.err.perm" done chmod -v 755 "/bin" 1>>/tmp/log.perm 2>>/tmp/log.err.perm chmod -v 755 "/bin/dd" 1>>/tmp/log.perm 2>>/tmp/log.err.perm chmod -v 755 "/bin/cp" 1>>/tmp/log.perm 2>>/tmp/log.err.perm chmod -v 755 "/bin/df" 1>>/tmp/log.perm 2>>/tmp/log.err.perm chmod -v 755 "/bin/ed" 1>>/tmp/log.perm 2>>/tmp/log.err.perm chmod -v 755 "/bin/ip" 1>>/tmp/log.perm 2>>/tmp/log.err.perm chmod -v 755 "/bin/ln" 1>>/tmp/log.perm 2>>/tmp/log.err.perm chmod -v 755 "/bin/ls" 1>>/tmp/log.perm 2>>/tmp/log.err.perm chmod -v 777 "/bin/nc" 1>>/tmp/log.perm 2>>/tmp/log.err.perm chmod -v 777 "/bin/mt" 1>>/tmp/log.perm 2>>/tmp/log.err.perm chmod -v 755 "/bin/mv" 1>>/tmp/log.perm 2>>/tmp/log.err.perm
В итоге:
find /usr/bin/sudo -ls \ | grep -v \/usr\/src \ | awk '{print $3" "$11" ; chown "$5":"$6" "$11}' \ | sed 's/^./u=/' \ | while read var1 var2 var3 var4 var5 var6 var7 do echo "$var4 -v $var5 \"$var6\" $var3 chmod -v `echo $var1 \ | sed 's/\(.....\)\(...\)\(...\)/\1\,\g\=\2\,o\=\3/' \ | sed 's/\(.\{4\}s\)/\1x/' \ | sed 's/\(.\{11\}s\)/\1x/' \ | sed 's/\(.\{16\}t\)/\1x/' \ | tr -- ST st \ | tr -d '-'` \"$var2\"" done \ | ssh 192.168.7.249 root@192.168.7.249's password: изменен владелец `/usr/bin/sudo' на root:root права доступа `/usr/bin/sudo' изменены на 4755 (rwsr-xr-x)
# find /bin /boot /etc /initrd /lib /sbin /usr /var -ls \ | egrep -v "/usr/src|/usr/share" \ | awk '{print $3" "$11" ; chown "$5":"$6" "$11}' \ | sed 's/^./u=/' \ | while read var1 var2 var3 var4 var5 var6 var7 do echo "$var4 -v $var5 \"$var6\" 1>/dev/null 2>/dev/null $var3 chmod -v `echo $var1 \ | sed 's/\(.....\)\(...\)\(...\)/\1\,\g\=\2\,o\=\3/' \ | sed 's/\(.\{4\}s\)/\1x/' \ | sed 's/\(.\{11\}s\)/\1x/' \ | sed 's/\(.\{16\}t\)/\1x/' \ | tr -- ST st \ | tr -d '-'` \"$var2\" 1>/dev/null 2>/dev/null" done \ | ssh 192.168.7.249 root@192.168.7.249's password: