Linux Named Pipes - запрос MKFIFO
Я довольно новичок в именованном Linux BASH, именованных каналах и т. д. Я следую примеру из этой статьи: https://www.linuxjournal.com/content/using-named-pipes-fifos-bash Все работает хорошо и, как и ожидалось, Однако это только начало. Я хотел бы иметь возможность вызывать сценарий писателя из программы чтения для передачи информации между двумя сценариями в конвейере без необходимости создания задания cron для сценария писателя.
Идея состоит в том, что кто-то запускает скрипт чтения без повышенных разрешений. Читатель вызывает писателя, который имеет жестко запрограммированного пользователя sudo (для целей тестирования), оценивает данные и возвращает результат читателю. Любой совет приветствуется.
1 ответ
Насколько я понимаю, вам требуется следующее:
- Автор, который прослушивает запросы на запись данных в именованный канал.
- Средство чтения, которое отправляет запросы на запись в устройство записи и считывает данные из именованного канала.
- Процесс записи должен выполняться как привилегированный пользователь, а читатель должен работать как пользователь с ограниченными правами.
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