URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9123
[ Назад ]

Исходное сообщение
"помогите найти ошибку"

Отправлено varvara_88 , 10-Май-11 19:49 
Второй год не могу сдать лабораторку по 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 #Вывод имени владельца-пользователя
fi

if [ "$g" = "w" ]
then
print_users_of_group
fi

if [ "$o" = "w" ]
then
{
print_users_of_group

echo $username
{
#niscat passwd.org_dir
cat /etc/passwd
} | nawk -F: '{print $1}';

} | sort | uniq -u #Удаляет все повторяющиеся сторки (для удаления имени владельца и имен пользователей группы-владельца из всего списка)
fi


} | sort | uniq
} else echo "error"
fi


Содержание

Сообщения в этом обсуждении
"помогите найти ошибку"
Отправлено phpcoder , 10-Май-11 20:42 
А в чем ваш вопрос? Что не так? Какие результаты ожидаете и какие получили?

"помогите найти ошибку"
Отправлено sany , 10-Май-11 21:47 
иногда лучше переписать, чем искать ошибку,
вот мой вариант скрипта, работает и для каталогов:

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


"помогите найти ошибку"
Отправлено varvara_88 , 10-Май-11 22:49 
>[оверквотинг удален]
> 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

спасибо огромное


"помогите найти ошибку"
Отправлено sany , 12-Май-11 18:56 
> спасибо огромное

на будущее: выражения типа "[[ $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