Ответ Steven Pritchard хорош, но я думал, что предложу другую презентацию подобной информации.
Каждый процесс работает как определенный пользователь ¹. Пользователь идентифицируется числом, идентификатором пользователя, который хранится в информации о процессе, доступной только ядру. Пользователь, идентификатор пользователя которого 0, имеет специальные полномочия и обычно звонится root
; имя root
не является особенным для ядра (но если Вы измените его, то Вы, вероятно, перепутаете много приложений). Много вещей, таких как загружающиеся модули ядра, получая доступ к большинству устройств непосредственно, и так далее, требуют, что процесс, который выполняет действие работать как идентификатор пользователя 0 ².
Когда начальные загрузки системы, первый процесс, запущенный ядром, работают как суперпользователь. Тот процесс, названный init
, в конечном счете запускает много системных служб (cron
, syslogd
, …) и программы входа в систему (login
, sshd
, и т.д.).
Когда Вы входите в систему, Вы вводите учетные данные (имя, пароль, …), и программа входа в систему проверяет их. Если учетные данные приняты, изменения программы входа в систему в Вашем идентификаторе пользователя (это - одно из полномочий, предоставленных суперпользователю).
При завинчивании пользовательской базы данных (который маловероятен, если Вы не обходите редактирование или удаление случайных файлов как корень), Вы не можете входить в систему больше. Вы все еще сможете загрузиться в однопользовательский режим или с живого CD для восстановления системы.
Программа sudo
позволяет Вам команды выполнения как корень. Обычно, если Вы запускаете программу, она наследовала идентификатор пользователя процесса, который запустил ее. Но sudo
корень setuid: это - исключение, определенное битами полномочий на /usr/bin/sudo
, это заставляет его работать как идентификатор пользователя 0 вместо этого. sudo
проверки, позволяется ли пользователь, который вызвал, выполнить команду с поднятыми полномочиями (путем консалтинга /etc/sudoers
), и или выполнения команда или сигналы ошибка.
¹ Иногда больше чем один, но это не подойдет в этом ответе.
² Или имеют правильную возможность, но не берут в голову это на данный момент.
Это - идеальный вариант использования для утилиты pee
.
./runme.sh | pee "grep ook >> ook.out" "grep eek >> eek.out"
В Debian и производных, pee
найден в moreutils
пакет.
Необходимо сделать egrep для обоих шаблонов затем.
'/.runme.sh | egrep "ook|eek"
но кажется, что необходимо перенаправить каждый вывод оценки шаблона в его собственный файл, который grep, кажется, не поддерживает. Любой, исправьте меня, если это возможно.
Править: minaev дал рабочий пример с мочой от moreutils, но если моча отсутствует на Вашей платформе, мы можем все еще использовать мишень как это. Просто игра с заменой процесса.
./runme.sh |tee >(grep ook > ook.txt) >(grep eek > eek.txt)
Пример:
[centos@centos scripts]$ ./runme.sh
eekfarapplebin
keeekmajowrwt
keekookjsfskooeek
ook
[centos@centos scripts]$ ./runme.sh | tee >(grep eek >eek.txt) >(grep ook >ook.txt)
eekfarapplebin
keeekmajowrwt
keekookjsfskooeek
ook
[centos@centos scripts]$ cat eek.txt
eekfarapplebin
keeekmajowrwt
keekookjsfskooeek
[centos@centos scripts]$ cat ook.txt
keekookjsfskooeek
ook
[centos@centos scripts]$
Я предполагаю, что runme является или длительной командой или требует атомарности (выполнения однажды).
Я предложил бы создать уникальное временное имя файла с mktemp
TMPFILE=$(mktemp)
./runme.sh > $TMPFILE
grep 'ook' $TMPFILE >> ook.out
grep 'eek' $TMPFILE >> eek.out
\rm -f $TMPFILE
tee
Мои старые узнают, что молитва Linux - изучает что-то повседневное новое, пробует его, практикует его, помнит это.
– bsd
16.12.2011, 18:05
Простое awk
альтернатива:
./runme.sh | awk '/ook/{print>>"ook.out"}/eek/{print>>"eek.out"}'
С небольшим дополнением awk
код может быть сделан легко расширяемым – просто вставленный в массив r, поскольку много пар выходного файла регулярного выражения необходимы:
./runme.sh | awk 'BEGIN{r["ook"]="ook.out";r["eek"]="eek.out"}{for(i in r)if($0~i)print>>r[i]}'
sed
w
команда эквивалентна из >
, печально нет никакого способа добавить в файл:
./runme.sh | sed -n $'/ook/wook.out\n/eek/week.out'
Мишень команды может сохранить копию переданного по каналу потока во временном файле. Затем мы можем grep исходный stdout и также временный файл отдельно:
./runme.sh |tee temp |grep ook >>ook.out;grep eek temp >>eek.out
pee
во всех системах. – cwd 07.01.2012, 17:12