Второй год не могу сдать лабораторку по UNIX "написать пр-му выдающую список пользователей, имеющих право записи в данный файл.#!/bin/bash
if str=`ls -l -- "$1"` 2>/dev/null
then
{
u=`echo $str | cut -c 3`
g=`echo $str | cut -c 6`
o=`echo $str | cut -c 9`
username=`echo $str | nawk '{print $3}'`
groupname=`echo $str | nawk '{print $4}'`
gid=`cat /etc/group | nawk -F: '$1=="'$groupname'" {print $3}'`
uid=`id -u "$username"`#Функция вывода имен пользователей группы, кроме владельца файла
print_users_of_group()
{
{ #Вывод имен пользователей, для которых данная группа является вторичной
#niscat group.org_dir
cat /etc/group
} | nawk -F: '$1=="'$groupname'" {print $NF}' | nawk -F, '{for(i=1; i<=NF; i++) { if ($i!="'$username'") {print $i}}}'
{ #Вывод имен пользователей, для которых данная группа является первичной
#niscat passwd.org_dir
cat /etc/passwd
} | nawk -F: '$4=="'$gid'" && $1!="'$username'" {print $1}'
}{
if [ "$u" = "w" ]
then
echo $username #Вывод имени владельца-пользователя
fiif [ "$g" = "w" ]
then
print_users_of_group
fiif [ "$o" = "w" ]
then
{
print_users_of_groupecho $username
{
#niscat passwd.org_dir
cat /etc/passwd
} | nawk -F: '{print $1}';} | sort | uniq -u #Удаляет все повторяющиеся сторки (для удаления имени владельца и имен пользователей группы-владельца из всего списка)
fi
} | sort | uniq
} else echo "error"
fi
А в чем ваш вопрос? Что не так? Какие результаты ожидаете и какие получили?
иногда лучше переписать, чем искать ошибку,
вот мой вариант скрипта, работает и для каталогов:perm=$(stat -c %A $1)
{
[[ $perm =~ ^..w.......$ ]] && stat -c %U $1;
[[ $perm =~ ^.....w....$ ]] && grep $(stat -c %G $1) /etc/group | cut -d : -f 4 | grep -v "^$" | sed 's/,/ /g'
[[ $perm =~ ^........w.$ ]] && cut -d : -f 1 /etc/passwd;
} | sort | uniq
>[оверквотинг удален]
> perm=$(stat -c %A $1)
> {
> [[ $perm =~ ^..w.......$ ]] && stat -c
> %U $1;
> [[ $perm =~ ^.....w....$ ]] && grep $(stat
> -c %G $1) /etc/group | cut -d : -f 4 |
> grep -v "^$" | sed 's/,/ /g'
> [[ $perm =~ ^........w.$ ]] && cut -d
> : -f 1 /etc/passwd;
> } | sort | uniqспасибо огромное
> спасибо огромноена будущее: выражения типа "[[ $perm =~ ^..w.......$ ]]" это "башизм", то есть то, что характерно для оболочки bash и может не поддерживаться в других шеллах.
для совместимости можно вместо него использовать выражение:
(echo $perm | grep -q ^..w.......$)
вот вариант скрипта без башизмов:perm=$(stat -c %A $1)
{
(echo $perm | grep -q ^..w.......$) && stat -c %U $1;
(echo $perm | grep -q ^.....w....$) && grep $(stat -c %G $1) /etc/group | cut -d : -f 4 | grep -v "^$" | sed 's/,/ /g'
(echo $perm | grep -q ^........w.$) && cut -d : -f 1 /etc/passwd;
} | sort | uniq