Linux 命名管道 - MKFIFO 查询

标签 linux named-pipes mkfifo

我在命名 Linux BASH、命名管道等方面相当陌生。 我正在关注这篇文章中的一个例子: https://www.linuxjournal.com/content/using-named-pipes-fifos-bash 一切正常,符合预期。然而,这仅仅是开始。 我希望能够从阅读器调用编写器脚本以在管道中的 2 个脚本之间传递信息,而不必为编写器脚本创建 cron 作业。

想法是有人在没有提升权限的情况下触发阅读器脚本。 读者调用具有一些硬编码 sudo 用户(用于测试目的)的作者,评估数据并将结果返回给读者。 任何建议表示赞赏。

最佳答案

据我了解,您需要满足以下条件:

  1. 监听将数据写入命名管道的请求的编写器。
  2. 读取器向写入器发送数据请求,并从命名管道读取数据。
  3. 写入进程应以特权用户身份运行,而读取进程应以低特权用户身份运行。

下面的脚本可以实现 1 和 2,其中:

  • writer 在后台运行并监听请求:sh writer.sh &
  • 当读取器运行时,它会向写入器发送一个信号,以触发向命名管道写入数据
  • 然后读取器随后从管道读取数据并输出数据。

3 是不可能的,因为:

  • 具有较低权限的进程不能向具有较高权限的进程发送信号。参见 this
  • 或者,由具有较低权限的用户运行的脚本无法启动另一个具有较高权限的脚本(即读取器无法启动具有较高权限的写入器)

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

关于Linux 命名管道 - MKFIFO 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51633182/

相关文章:

linux - 在linux中预留物理地址空间

linux - 为什么在 shell 中使用 "echo"时我的部分字符串会消失?

sql-server - 为 SQL Server LocalDB 创建永久别名

c++ - 为什么这里举例说明在 LINUX 中使用命名管道 -FIFO 的程序会出现竞争条件?

ruby - 在 Ruby 中创建命名管道

Linux终端输出重定向

c++ - 如何获取命名管道中要(可靠地)读取的数据长度?

c - 在 C 中实现流水线。最好的方法是什么?

ios - 是否可以在iOS中创建和使用FIFO文件? (ObjC)

linux - pclose() 间歇性地返回 SIGPIPE