Может команда в конвейере оболочки определять tty характеристики своего контекста?

[116065] Это можно сделать, прикрепив спичку к началу линии или разделитель. Например, с помощью расширенного регулярного выражения GNU sed:
  • -вывод:
  • 1
    24.03.2015, 04:04
    1 ответ

    Я наконец нашел решение, которое искал. Iptables имеет модуль rateest , который делает именно это. Например:

    # collects all ingress traffic to RATEEST target
    iptables -A INPUT -j RATEEST --rateest-name RE1 --rateest-interval 500.0ms --rateest-ewmalog 1s
    # creates a log entry(jumps to LOG target) if rate is greater than 10Mbps
    iptables -A INPUT -m rateest --rateest RE1 --rateest-gt --rateest-bps 10Mbps -j LOG --log-prefix "Ingress bandwidth >10Mbps "
    
    -121--86053-

    Вот ответы:

    1. root всегда имеет полный доступ к файлам и каталогам. Они обычно тоже есть у владельца файла, но это не всегда так. Например:

       -r-xr- --- 1 пользователь 1 пользователи 199 Окт 14 18:42 otherfile.bin
      

      user1 является владельцем ; однако они могут только читать и выполнять , но root по-прежнему имеет полный доступ ( rwx ) к файлу.

    2. RUID является реальным идентификатором пользователя и никогда (почти) не изменяется. Если user2 входит в систему, оболочка запускается с реальным идентификатором user2 . Все процессы, которые они начинают с оболочки, наследуют действительный идентификатор user2 в качестве их действительного идентификатора.

      EUID - это эффективный идентификатор пользователя , который изменяется для процессов (не для пользователя), выполняемых пользователем, для которых установлен бит setuid .

      Если user2 выполняет file.bin , RUID будет user2 , а EUID запущенного процесса будет user1 .

    Давайте воспользуемся случаем passwd :

    -rwsr-xr-x 1 root root 45396 may 25  2012 /usr/bin/passwd
    
    • Когда user2 хочет изменить свой пароль , они выполняют /usr/bin/passwd .

    • RUID будет user2 , но EUID этого процесса будет root .

    • user2 может использовать passwd для изменения только собственного пароля, поскольку внутренний passwd проверяет RUID и, если он не является root , его действия будут ограничены реальным паролем пользователя.

    • Необходимо, чтобы EUID стал корневым в случае passwd , потому что процессу необходимо записать в /etc/passwd и/или /etc/shadow .

    -121--17379-

    Вы можете попробовать вещи с помощью сценария, такого как

    #!/bin/sh
    
    for fd in 0 1 2; do
        if [ -t $fd ]; then echo $fd is a TTY; fi
    done
    

    Запуск этого я вижу, что:

    • если сценарий выполняется сам по себе, все три FD являются TTE
    • , если сценарий выполняется в начале конвейера, stdin и stderr являются TTE
    • , если сценарий выполняется в середине конвейера, stderr является TTY
    • , если сценарий выполняется в конце конвейера, stdout и stderr являются TTY

    . Все это кажется логичным. Очевидно, что если конвейер перенаправляет stderr , то поведение будет другим.

    Чтобы полностью ответить на ваш вопрос, я не думаю, что можно определить характеристики терминала во всех случаях, но если вы можете найти FD (изучить все записи в /dev/fd ), который является TTY, вы можете запустить stty на этом...Но с середины трубопровода невозможно определить, куда идет конец трубопровода.

    Как упомянуто Янис , если вы хотите узнать информацию о управляющем терминале, независимо от конвейера, вы можете использовать /dev/tty , например с stty -F/dev/tty ; но это приведет к сбою, если сценарий выполняется без управляющего терминала, например из задания cron .

    6
    27.01.2020, 23:15

    Теги

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