【问题标题】:Is there a way to make a bash script process messages that have been sent to it using the write command有没有办法让 bash 脚本处理使用 write 命令发送给它的消息
【发布时间】:2023-03-06 05:53:01
【问题描述】:

有没有办法让 bash 脚本处理使用“write”命令发送给它的消息?因此,例如,如果用户想要激活我脚本中的某个功能,我是否可以这样做,以便他们可以使用 write 命令向脚本发送命令?

我想到的一种可能的方法是为屏幕会话配置日志记录,然后让 bash 脚本通过那里解析文本,但我不确定是否有更简单或更有效的方法来解决这个问题

编辑:我正在考虑作为替代解决方案,我可以使用命名管道。我担心如果 tmp 分区完全填满它会中断(不确定这是否也会影响写入?)。我将在一个共享的盒子上运行这个脚本,每隔一段时间就会有人完全填满 /tmp 分区,然后就这样一直这样下去,直到人们开始抱怨

【问题讨论】:

  • 为什么要使用 write 命令发送它?
  • @123 会有更好的方法吗?我正在尝试这样做,以便用户可以触发脚本中的函数,而无需对脚本本身进行读/写访问。我在想我也可以让用户将命令输入到脚本会监视的文件中,尽管我觉得这个选项可能更通用
  • 激活脚本中的功能是什么意思?脚本是否连续运行?你能举一个脚本会做什么的例子吗?
  • 你可以用 fifo 来做到这一点,但我更喜欢 write 的想法。可以删除fifo。
  • @123 我会在屏幕会话中运行一个脚本,只要用户使用 write 命令等向它发送命令,它就会向另一台服务器发送 SOAP 请求。用户通常无权访问到将处理 SOAP 请求的服务器,因此这将允许它们执行一些基本功能(管理和取消管理设备的监控),而不必在服务器本身上拥有帐户

标签: linux bash debian


【解决方案1】:

嗯,你正试图绕过一个糟糕的 unix 命令来询问它没有指定的东西。从手册页(强调我的):

写入实用程序允许您通过复制与其他用户交流 从您的终端到他们的线路

这意味着 write 旨在直接在终端上复制行。你一说,我就用屏幕转储终端输出,然后解析转储文件,你就失去了写的简单性(而且还需要磁盘空间,还有从顺序文件中删除旧行的问题)

更糟糕的是,由于您的脚本独立存在,它可能(应该?)是一个不连接终端的守护程序脚本

所以如果我正确理解了你的问题,你的要求是:

  • 一个执行某些任务并且应该能够响应异步请求的脚本 - 常见用法是命名管道或网络或 unix 域套接字,不太常见的是专用文件夹中的文件,带有一个可选信号以立即处理,添加行由于访问问题的同步,在可能的情况下写入顺序文件并不常见
  • 一种简单而愉快的方式供用户传递请求。好的write 很适合这部分,但恕我直言太难接口了

如果您不想在这方面浪费时间使用标准工具,我会推荐邮件系统。将邮件地址别名为将使用邮件消息作为输入调用的程序是微不足道的。但我不确定是否值得,因为用户可以直接将请求作为输入或命令行参数调用程序。

所以客户端部分可能只是一个程序:

  • 在专用文件夹中创建一个临时文件(mkstemp 是您在 C 或 C++ 中的朋友,或者 mktemp 在 shell 中 - 但要注意竞争条件)
  • 将请求写入该文件
  • 可选择向 pid 发送信号 - 前提是脚本在启动时将自己的 PID 写入专用文件

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 2023-03-27
    • 2021-03-28
    • 2021-06-01
    • 2023-03-03
    • 2016-08-25
    • 1970-01-01
    相关资源
    最近更新 更多