Shell脚本向套接字发送消息并保持连接活动

时间:2012-11-15 18:15:48

标签: shell

我是shell脚本的新手,我的问题是我不确定如何使我的套接字连接活着。 我不确定我写的脚本是否正在做它应该做的事情。

我尝试做的是,我相信我创建了140个套接字并向这些套接字发送消息,我希望这些套接字连接保持活跃状态​​。

for (( i=0; i<140; i++))
do
echo "Message" > /dev/tcp/187.98.06.01/4599
done

有一个我发送此消息的服务器,我也收到一条日志消息,说服务器端建立了客户端连接,但是当我检查套接字连接的数量时,该数字是0.我不确定是否因为套接字连接已关闭。

我需要保持套接字连接活着。 任何人都可以为上述代码提供建议或修复。

1 个答案:

答案 0 :(得分:2)

  

我使用GNU bash,版本3.2.25(1)-release(x86_64-redhat-linux-gnu)。

这不是非常安全不是非常便携,但你能够写:

# Open 140 TCP connections to port 4599 on 187.98.06.01, using
# file-descriptors 60 through 199:
for (( i = 0 ; i < 140 ; i++ )) ; do
    fd=$((i + 60))
    eval exec "$fd<>/dev/tcp/187.98.06.01/4599"
    echo Message >&$fd
done

# ... do whatever you want with these 140 connections ...

# Close the connections:
for (( i = 0 ; i < 140 ; i++ )) ; do
    fd=$((i + 60))
    eval exec "$fd<&-" "$fd>&-"
done

(它不可移植的原因在于它取决于所有shell都不共享的Bash功能。它不安全的原因是shell使用文件描述符来处理它自己的内部内容,例如打开脚本和搜索目录。描述符0到9 - STDIN,STDOUT,STDERR和其他七个 - 供你使用,但描述符10和更高的风险与shell正在做的事情相冲突。在Bash 4.x中有一个功能可以让你提供一个变量-name为重定向,让Bash决定使用哪个文件描述符,但Bash 3.x没有。)