The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"помогите найти ошибку"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

"помогите найти ошибку"  +/
Сообщение от varvara_88 email(ok) on 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

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "помогите найти ошибку"  +/
Сообщение от phpcoder email(ok) on 10-Май-11, 20:42 
А в чем ваш вопрос? Что не так? Какие результаты ожидаете и какие получили?
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "помогите найти ошибку"  +/
Сообщение от sany (ok) on 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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3. "помогите найти ошибку"  +/
Сообщение от varvara_88 email(ok) on 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

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

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "помогите найти ошибку"  +/
Сообщение от sany (ok) on 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

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру