Bash 脚本语句

标签 bash unix scripting netcat mkfifo

我试图弄清楚 bash 脚本文件中一行的含义:

mkfifo mypipe
nc -l 12345 < mypipe | /home/myprogram > mypipe

这是我的理解: nc -l 部分在端口 12345 上创建类似服务器端的行为,该行为从 mypipe 接收输入,将输出通过管道输送到程序,再将程序输出通过管道输送回 mypipe。

我的问题首先是我的分析正确吗?其次,mkfifo到底是什么,它是什么样的文件?我也不明白 nc -l 到底输出什么以便通过管道传输到 myprogram。

感谢您的帮助。

最佳答案

mkfifo 创建一个管道文件。这里,FIFO的意思是“先进先出”。无论一个进程向管道中写入什么内容,第二个进程都可以读取。它不是一个“真正的”文件——数据永远不会保存到磁盘上;但是 Linux 将许多机制抽象为文件,以简化事情。

nc -l 12345 将绑定(bind)到套接字 12345 并监听;当它捕获传入连接时,会将标准输入传递到远程主机,并将远程主机的传入数据传递到标准输出。

因此,这里的架构是:

remote host -> nc -> regular pipe -> myprogram
myprogram -> mypipe -> nc -> remote host

有效地让 myprogram 和远程主机对话,即使 myprogram 被设计为从 stdin 读取并写入 stdout。

由于 bash 管道 (|) 仅处理一个方向的通信,因此您需要创建一个显式的第二个管道来进行双向进程间连接。

关于Bash 脚本语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8570795/

相关文章:

bash - Docker 下载并安装二进制文件

php - Godaddy 主机上的 CakePHP 控制台

arrays - 重置数组并用 bash 脚本中的值填充它

unix - set -e 命令在 Unix 中有什么作用?

linux - 为什么 shell 解释单引号内的字符?

ant - 如果 exec 任务失败,如何使 ant 脚本失败

linux - 在 Linux 中根据修改日期复制文件

c - 在 C 程序中嵌入 Unix 日期

c++ - 数据报 Unix 套接字上的 ECONNREFUSED

java - 沙盒 JSR-223