【发布时间】:2015-02-14 08:00:39
【问题描述】:
我正在尝试使用 bash 创建持久连接。在终端 1 上,我让 netcat 作为服务器运行:
$ nc -vlkp 3000
Listening on [0.0.0.0] (family 0, port 3000)
在 2 号航站楼,我创建了一个 fifo 并养了一只猫:
$ mkfifo fifo
$ cat > fifo
在终端 3 上,我将 fifo 作为客户端 netcat 的输入:
$ cat fifo | nc -v localhost 3000
Connection to localhost 3000 port [tcp/*] succeeded!
在 4 号航站楼,我发送我想要的任何东西:
$ 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 的输出等。
谢谢!
【问题讨论】:
-
您好,欢迎来到 Stack Overflow!这是我见过的最好的初学者问题。