Получите вывод команды времени

Принятие строк в файле журнала находится в хронологическом порядке, и что СУЩЕСТВУЕТ событие в 0:00 и 0:09:

awk '/^13\/10\/16 00:00/,/^13\/10\/16 09:00/ {print}' file.log

Я нахожу вышеупомянутое легким помнить и большой инструмент при исследовании журналов. Предположения слишком широки для производственного использования.

3
09.11.2014, 01:27
2 ответа

Бит 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 без запроса пароля? .

-121--10223-

Для этого мне понадобились две автокарты. Чтобы достичь промежутка между заголовками и сообщением, найдите пустую строку:

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 из каждого из приведенных выше примеров.

2
27.01.2020, 21:27
  • Вы можете использовать встроенную команду -в оболочке (, например. в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
    
0
27.01.2020, 21:27

Теги

Похожие вопросы