Linux Named Pipes - запрос MKFIFO

Я довольно новичок в именованном Linux BASH, именованных каналах и т. д. Я следую примеру из этой статьи: https://www.linuxjournal.com/content/using-named-pipes-fifos-bash Все работает хорошо и, как и ожидалось, Однако это только начало. Я хотел бы иметь возможность вызывать сценарий писателя из программы чтения для передачи информации между двумя сценариями в конвейере без необходимости создания задания cron для сценария писателя.

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

1 ответ

Насколько я понимаю, вам требуется следующее:

  1. Автор, который прослушивает запросы на запись данных в именованный канал.
  2. Средство чтения, которое отправляет запросы на запись в устройство записи и считывает данные из именованного канала.
  3. Процесс записи должен выполняться как привилегированный пользователь, а читатель должен работать как пользователь с ограниченными правами.

1 и 2 возможны с помощью сценариев ниже, где:

  • Writer запускается в фоновом режиме и слушает запросы: sh writer.sh &
  • Когда читатель запущен, он посылает сигнал писателю, чтобы инициировать запись данных в именованный канал
  • Затем считыватель затем читает данные из канала и выводит данные.

3 невозможно, потому что:

  • Процесс с более низкими привилегиями не может отправлять сигналы процессу с более высокими привилегиями. Смотрите это
  • В качестве альтернативы, сценарий, запускаемый пользователем с более низкими привилегиями, не может запустить другой сценарий с более высокими привилегиями (т.е. читатель не может запустить программу записи с более высокими привилегиями).

writer.sh

#!/bin/bash

# Store the value of the writer process
echo $$ > /tmp/pid
# Specify location of named pipe
pipe=/tmp/datapipe

# Create Data pipe if it doesn't exist
if [[ ! -p $pipe ]]; then
   echo "Pipe does not exist. Creating..."
   mkfifo $pipe
fi

# Send data to pipe
echo "Hello" >$pipe

# Send data to pipe based on trigger
function write_data {
   echo "Writing data"
   echo "Here is some data" >$pipe &
}

# Kill process based on trigger
function kill {
   echo "Exiting"
   exit
}

# Listen for signals
trap write_data SIGINT
trap kill KILL

# listen
while true; do
   sleep 1;
done

reader.sh

#!/bin/bash
pipe=/tmp/datapipe

# Read the writer pid
pid=$(cat /tmp/pid)  

# Trigger writer to create data
kill -s SIGINT $pid

# Read data from named pipe
if read line <$pipe; then
   echo $line
fi
Другие вопросы по тегам