我正在尝试使用bash创建一个持久连接。在终端1上,我保持一个netcat作为服务器运行:
$ nc -vlkp 3000
Listening on [0.0.0.0] (family 0, port 3000)
在终端2上,我创建了一个命名管道,并运行了cat命令:
$ mkfifo fifo
$ cat > fifo
在第三个终端上,我将fifo作为客户端netcat的输入:
$ cat fifo | nc -v localhost 3000
Connection to localhost 3000 port [tcp/*] succeeded!
在第四个终端上,我可以发送任何想要的内容:
$ echo command1 > fifo
$ echo command2 > fifo
$ echo command3 > fifo
回到终端1,我看到命令已经被接收:
$ nc -vlkp 3000
Listening on [0.0.0.0] (family 0, port 3000)
Connection from [127.0.0.1] port 3000 [tcp/*] accepted (family 2, sport 41722)
command1
command2
command3
所以,一切正常。但是当我将其放入脚本中(我称之为fifo.sh),bash就无法写入到FIFO中:
在终端1中,同样的监听服务器:
$ nc -vlkp 3000
Listening on [0.0.0.0] (family 0, port 3000)
在终端2上,我运行了该脚本:
#!/bin/bash
rm -f fifo
mkfifo fifo
cat > fifo &
pid1=$!
cat fifo | nc -v localhost 3000 &
pid2=$!
echo sending...
echo comando1 > fifo
echo comando2 > fifo
echo comando3 > fifo
kill -9 $pid1 $pid2
终端2的输出为:
$ ./fifo.sh
Connection to localhost 3000 port [tcp/*] succeeded!
sending...
在终端1上,我只看到连接而没有命令:
$ nc -vlkp 3000
Listening on [0.0.0.0] (family 0, port 3000)
Connection from [127.0.0.1] port 3000 [tcp/*] accepted (family 2, sport 42191)
Connection closed, listening again.
有什么想法为什么它只能交互式地工作吗?或者还有其他方法只使用Bash创建持久连接吗?我不想使用Expect,因为我有一个更大的Bash脚本,在发送command1之后执行一些工作,而command2取决于command1的输出等。
谢谢!