Опасности передачи на стандартный ввод процесса на другом терминале

Один из распространенных способов сделать это — проверить, существует ли нужная вам программа и доступна ли она на вашем PATH. Например:

get_username(){
  uid="$1"

  # First try using getent
  if command -v getent > /dev/null 2>&1; then 
    getent passwd "$uid" | cut -d: -f1

  # Next try using the UID as an operand to id.
  elif command -v id > /dev/null 2>&1 && \
       id -nu "$uid" > /dev/null 2>&1; then
    id -nu "$uid"

  # Next try perl - perl's getpwuid just calls the system's C library getpwuid
  elif command -v perl >/dev/null 2>&1; then
    perl -e '@u=getpwuid($ARGV[0]);
             if ($u[0]) {print $u[0]} else {exit 2}' "$uid"

  # As a last resort, parse `/etc/passwd`.
  else
      awk -v uid="$uid" -F: '
         BEGIN {ec=2};
         $3 == uid {print $1; ec=0; exit 0};
         END {exit ec}' /etc/passwd
  fi
}

Поскольку POSIX idне поддерживает аргументы UID, предложение elifдля idдолжно проверять не только наличие idв PATH, но также и его выполнение без ошибок. Это означает, что он может запустить idдважды, что, к счастью, не окажет заметного влияния на производительность. Также возможно, что и id, и awkбудут запущены с одинаковым незначительным снижением производительности.

Кстати, при использовании этого метода нет необходимости сохранять выходные данные. Будет запущен только один из них, поэтому только один из них будет печатать выходные данные для возврата функции.

0
27.11.2021, 09:52
2 ответа

Это может быть простым объяснением:

Если терминальный процесс записывает в терминал (stdin, stdoutи stderr, все они указывают на одно и то же устройство/элемент ), тогда этот вывод не становится его следующим вводом. Очевидно.

эхо фу

не имеет такого же эффекта, как ввод fooвведите .

Так почему же другой процесс, пишущий на терминал, становится вводом терминала другого процесса? Не имеет никакого смысла.

В отличие от файла, с (псевдо-)терминалом данные, записываемые в него и считываемые с него, не связаны, поскольку источником данных является нечто совершенно другое (клавиатура или программа ). См. man 7 pty. Псевдотерминал имеет клиентскую сторону, которая используется терминальными приложениями, и главную сторону, на которой генерируются входные данные для клиентской стороны.

Мой эмулятор терминала — konsole (PID 40818 ), в настоящее время работает только одна оболочка/терминал:

start cmd:> ll /proc/40818/fd
insgesamt 0
lr-x------ 1 hl hauke 64 27. Nov 15:06 0 -> 'pipe:[1177680901]'
lrwx------ 1 hl hauke 64 27. Nov 15:06 1 -> 'socket:[89302]'
lrwx------ 1 hl hauke 64 27. Nov 15:06 10 -> /dev/dri/renderD128
lrwx------ 1 hl hauke 64 27. Nov 15:06 11 -> /dev/dri/renderD128
lrwx------ 1 hl hauke 64 27. Nov 15:06 12 -> /dev/dri/renderD128
lrwx------ 1 hl hauke 64 27. Nov 15:06 13 -> /dev/dri/renderD128
lrwx------ 1 hl hauke 64 27. Nov 15:06 18 -> /dev/ptmx
lrwx------ 1 hl hauke 64 27. Nov 15:06 19 -> /dev/pts/40
lrwx------ 1 hl hauke 64 27. Nov 15:06 2 -> 'socket:[89302]'
l-wx------ 1 hl hauke 64 27. Nov 15:06 21 -> 'pipe:[1177664260]'
lr-x------ 1 hl hauke 64 27. Nov 15:06 28 -> 'pipe:[1177664264]'
l-wx------ 1 hl hauke 64 27. Nov 15:06 29 -> 'pipe:[1177664264]'
lrwx------ 1 hl hauke 64 27. Nov 15:06 3 -> 'socket:[1177673938]'
lrwx------ 1 hl hauke 64 27. Nov 15:06 4 -> 'anon_inode:[eventfd]'
lrwx------ 1 hl hauke 64 27. Nov 15:06 5 -> 'anon_inode:[eventfd]'
lrwx------ 1 hl hauke 64 27. Nov 15:06 6 -> 'socket:[1177650969]'
lrwx------ 1 hl hauke 64 27. Nov 15:06 7 -> 'anon_inode:[eventfd]'
lrwx------ 1 hl hauke 64 27. Nov 15:06 8 -> 'socket:[1177677086]'
lrwx------ 1 hl hauke 64 27. Nov 15:06 9 -> 'socket:[1177677087]'

ec:0   15:06:36  hl@monster:~
start cmd:> tty
/dev/pts/40

Как видите, оболочка использует /dev/pts/40, но эмулятор терминала пишет в /dev/ptmx. Только файловый дескриптор 18эмулятора терминала может записывать на вход /dev/pts/40. Если другой процесс открывается /dev/ptmx, он создает новый псевдотерминал, на который записывается.

1
27.11.2021, 13:10

Часть 1 -это ответ на ваш вопрос? Запись процесса на стандартный ввод

Часть 2 -вы можете писать в (и читать из )терминала, принадлежащего любому процессу, которым вы владеете. Но стандартные разрешения UNIX не позволят вам писать на (или читать с )любого устройства, связанного с другим логином пользователя.

ls -l /proc/$$/fd/0
lrwx------ 1 roaima roaima 64 Nov 27 13:19 /proc/7859/fd/0 -> /dev/pts/0

ls -lL /proc/$$/fd/0
crw--w---- 1 roaima tty 136, 0 Nov 27 13:24 /proc/7859/fd/0

Я могу писать на это устройство:

( tput smso; echo 'surprise!' ) >/dev/pts/0
3
27.11.2021, 12:20

Теги

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