Команда sudo не работает, когда strace прилагается с PID bash

Я беру журналы команды, выполняемые пользователем в выходном файле, добавляя PID BASH в strace .

$ strace -q -f -e execve -p $$ -o <outputFile>

Он работает нормально, и я получаю весь список команд в выходном файле.

Но я столкнулся с другой проблемой. Я не могу запустить команду sudo когда strace прилагается с BASH PID.

Я получаю следующую ошибку:

sudo: effective uid is not 0, is sudo installed setuid root?

Я проверил setuid , установленный на sudo binary

---s--x--x. 1 root root 123832 Mar 22 11:35 /usr/bin/sudo

sudo отлично работает, когда я останавливаю strace .

Это ошибка или есть какая-то техническая причина? Пожалуйста помоги мне с этим.

  • Запускать и останавливать команду мониторинга как sudo в течение секунд каждые минуты
  • Команда «sudo rm \\» зависает - хотите, чтобы система не наносила ущерба системе
  • Программное обеспечение, такое как Iceweasel и LibreOffice, не будет работать без root / sudo
  • ошибка открытого файла с открытым файлом с помощью команды «sudo», но НЕ с «sudo bash», то такая же команда?
  • Отключить кеширование корневого пароля
  • Перезапустить PHP-FPM из скрипта PHP
  • копирование удаленных корневых файлов, когда «PermitRootLogin no»
  • sudo после длительного вызова сна без повторного запроса пароля sudo
  • 2 Solutions collect form web for “Команда sudo не работает, когда strace прилагается с PID bash”

    Существуют и другие способы регистрации всех команд, выполняемых пользователем. С установленным sysdig можно запустить что-то вроде

     # sysdig "user.name = jdoe and evt.type = execve" 

    регистрировать все вызовы execve(2) jdoe ; опция -p для sysdig может настроить формат вывода и т. д.

    Другой способ – использовать SystemTap который имеет то преимущество, что поддерживается RedHat; здесь мы предполагаем, что jdoe имеет UID 1000 ;

     probe begin { printf("begin trace...\n\n") } probe syscall.execve.return { if (uid() != 1000) next; printf("runs %s[%d]: %s\n", execname(), pid(), cmdline_str()); } 

    это может быть выполнено через что-то вроде

     # stap-prep ... # stap whatyousavedtheaboveas.stp 

    Оба метода, скорее всего, потребуют корректировки, чтобы точно зафиксировать то, что вам нужно, обрабатывать условия ошибки, когда execve не работает, и т. Д. С плюсом стороны sysdig и SystemTap намного эффективнее, чем strace (запустите vmstat 1 и посмотрите, как strace подталкивает контекстные переключатели через крыша при работе).

    В руководстве для strace упоминается, что:

    ОШИБКИ
    Программы, использующие бит setuid, не имеют эффективных прав идентификатора пользователя во время трассировки.

    Хотя я подозреваю, что это больше связано с последствиями безопасности для отладки процесса setuid, чем ошибка. Если я не ошибаюсь, strace использует тот же интерфейс трассировки, что, скажем, gdb , и позволяет, среди прочего, изменять память текущего процесса. Возможность сделать это для процесса, который работает с большей привилегией, чем вы предполагали, будет плохой идеей.

    Linux и Unix - лучшая ОС в мире.