作为我正在尝试编写的更大脚本的基础,我正在尝试基本上在 bash 中实现一个基本的 netcat 客户端。我当前的脚本在技术上有效,它看起来像这样:
#!/bin/bash
exec 3<>/dev/tcp/$1/$2
cat <&3 &
cat <&1 >3
它的问题是它留下了一个需要杀死的挂猫进程,但我想不出一种自动的方法来做到这一点,而且手动运行pkill cat
似乎并不运动。
我已经接受杰里米的回答是正确的,但对于任何好奇的人来说,这里是我最终得到的完整脚本:
#!/bin/bash
exec 3<>/dev/tcp/$1/$2
control_c()
{
kill $CAT_PID
exit $?
}
trap control_c SIGINT
cat <&3 &
CAT_PID=$!
cat >&3
这是一个可怕的组合,但你可以产生一个子shell,所以像这样:
CAT1_PID=$$
echo CAT1_PID > /tmp/CAT1_PID
exec cat <&3 &
然后,当然,如果该脚本的多个副本碰巧正在运行,您就会遇到竞争条件。
根据您的外壳,您可能能够在 PS 列表中调用某种形式的 exec 和“重命名”cat。那么你就可以
pkill the_cat_that_ate_the_network