Принятие строк в файле журнала находится в хронологическом порядке, и что СУЩЕСТВУЕТ событие в 0:00 и 0:09:
awk '/^13\/10\/16 00:00/,/^13\/10\/16 09:00/ {print}' file.log
Я нахожу вышеупомянутое легким помнить и большой инструмент при исследовании журналов. Предположения слишком широки для производственного использования.
Бит setuid может быть установлен в исполняемом файле так, что при запуске программа будет иметь привилегии владельца файла, а не реального пользователя, если они отличаются. Это разница между эффективным uid (идентификатором пользователя) и реальным uid.
Некоторые распространенные утилиты, такие как passwd
, принадлежат корню и настроены таким образом, чтобы избежать необходимости ( passwd
должен иметь доступ к /etc/shadow
, который может быть прочитан только корнем).
Лучшая стратегия при этом заключается в том, чтобы сделать все, что вам нужно сделать в качестве суперпользователя сразу же, а затем понизить привилегии, чтобы ошибки или неправильное использование были менее вероятны во время запуска root. Для этого необходимо установить для эффективного uid процесса значение реального uid. В POSIX C:
#define _POSIX_C_SOURCE 200112L // Needed with glibc (e.g., linux).
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
void report (uid_t real) {
printf (
"Real UID: %d Effective UID: %d\n",
real,
geteuid()
);
}
int main (void) {
uid_t real = getuid();
report(real);
seteuid(real);
report(real);
return 0;
}
Соответствующие функции, которые должны иметь эквивалент в большинстве языков более высокого уровня, если они обычно используются в системах POSIX:
getuid ()
: Get the real uid. geteuid ()
: Получение эффективного uid. seteuid ()
: Установка эффективного uid. Нельзя ничего сделать с последним, неподходящим для реального uid , за исключением того, что бит setuid был установлен в исполняемом файле . Чтобы попробовать это, скомпилируйте gcc test.c -o testuid
. Затем необходимо, с привилегиями:
chown root testuid
chmod u+s testuid
Последний устанавливает бит setuid. При выполнении ./testuid
в качестве обычного пользователя процесс по умолчанию запускается с эффективным 0 uid, root.
Это зависит от платформы , но в Linux вещи, требующие интерпретатора, включая байт-код, не могут использовать бит setuid, если он не набор на интерпретаторе (что было бы очень глупо). Вот простой сценарий perl, который имитирует код C выше:
#!/usr/bin/perl
use strict;
use warnings FATAL => qw(all);
print "Real UID: $< Effective UID: $>\n";
$> = $<; # Not an ASCII art greedy face, but genuine perl...
print "Real UID: $< Effective UID: $>\n";
True to it's * nixy roots, perl имеет построение в специальных переменных для эффективного uid ( $ >
) и реального uid ( $ <
). Но если вы попытаетесь использовать те же chown
и chmod
, которые используются с компилированным (из C, предыдущий пример) исполняемым файлом, это не будет иметь никакого значения. Скрипту не удается получить привилегии.
Ответ на этот вопрос заключается в использовании двоичного файла setuid для выполнения сценария:
#include <stdio.h>
#include <unistd.h>
int main (int argc, char *argv[]) {
if (argc < 2) {
puts("Path to perl script required.");
return 1;
}
const char *perl = "perl";
argv[0] = (char*)perl;
return execv("/usr/bin/perl", argv);
}
Compile this gcc --std = c99 whatever.c -o perlsuid
, then chown root perlsuid & & chmod u + s perlsuid
. Теперь можно выполнить любой perl скрипт с эффективным uid 0, независимо от того, кому он принадлежит.
Аналогичная стратегия будет работать с php, python и т.д. Но...
# Think hard, very important:
>_< # Genuine ASCII art "Oh tish!" face
ПОЖАЛУЙСТА НЕ ОСТАВЛЯЙТЕ такого рода вещи вокруг . Скорее всего, вы действительно хотите скомпилировать в имени сценария как абсолютный путь , то есть заменить весь код в main ()
на:
const char *args[] = { "perl", "/opt/suid_scripts/whatever.pl" }
return execv("/usr/bin/perl", (char * const*)args);
Они убедитесь, что /opt/suid _ скрипты
и все в нем доступно только для чтения для пользователей, не являющихся корневыми.В противном случае кто-либо может поменяться местами на whatever.pl
.
Кроме того, следует помнить, что многие языки сценариев позволяют переменным среды изменять способ выполнения сценария . Например, переменная среды может вызвать загрузку библиотеки, предоставленной вызывающей стороной, что позволяет вызывающей стороне выполнять произвольный код в качестве корня. Таким образом, если вы не знаете, что интерпретатор и сам сценарий устойчивы ко всем возможным переменным среды, НЕ ДЕЛАЙТЕ ЭТОГО .
Более безопасный способ разрешить пользователю, не являющемуся пользователем root, запускать сценарий как root - это добавить правило sudo и поручить пользователю запускать sudo/path/to/script
. Sudo удаляет большинство переменных среды, а также позволяет администратору точно выбирать, кто может выполнить команду и с какими аргументами. Пример см. в разделе Как запустить определенную программу как root без запроса пароля? .
Для этого мне понадобились две автокарты. Чтобы достичь промежутка между заголовками и сообщением, найдите пустую строку:
autocmd BufRead /tmp/mutt-* execute "normal /^$/\n"
, затем перейдите в режим вставки:
autocmd BufRead /tmp/mutt-* execute ":startinsert"
-121--186730- Команда time
выведет его на стандартный, а не стандартный вывод. Вот что нужно запечатлеть. Затем необходимо зафиксировать выходные данные времени
, а не выходные данные команды, по которой выполняется синхронизация. Как правило, это выполняется путем группирования или выполнения команд во вложенном корпусе (в {}
или ()
соответственно), перенаправления вывода группы на /dev/null
и перенаправления ее ошибки на стандартный вывод. Например,
$ declare -a array=( $( { time ls; } 2>&1 >/dev/null ))
$ echo ${array[*]}
real 0m0.003s user 0m0.000s sys 0m0.000s
Для сохранения каждой строки в качестве элемента массива используется mapfile
builtin. Тем не менее, созданный массив будет доступен только в пределах группировки:
$ { time ls; } 2>&1 >/dev/null | {
mapfile array1;
echo "1: ${array1[1]}2:${array1[2]}3:${array1[3]}";
}
1: real 0m0.003s
2:user 0m0.000s
3:sys 0m0.000s
Я не уверен, хотите ли вы получить выходные данные команды в массиве или только выходные данные time
. Если также требуется команда, удалите >/dev/null
из каждого из приведенных выше примеров.
Вы можете использовать встроенную команду -в оболочке (, например. вbash
)
$ time ( sleep 1 ) 2> ttt
$ cat ttt
real 0m1,001s
user 0m0,001s
sys 0m0,000s
Встроенная команда -довольно проста. Это описывается следующей командой
help time
Вы также можете использовать программуtime
$ /usr/bin/time -po ttt sleep 2
$ cat ttt
real 2.00
user 0.00
sys 0.00
Программа имеет множество опций, которые описаны в руководстве
man time