5

作为我正在尝试编写的更大脚本的基础,我正在尝试基本上在 bash 中实现一个基本的 netcat 客户端。我当前的脚本在技术上有效,它看起来像这样:

#!/bin/bash

exec 3<>/dev/tcp/$1/$2         

cat <&3 &                      
cat <&1 >3

它的问题是它留下了一个需要杀死的挂猫进程,但我想不出一种自动的方法来做到这一点,而且手动运行pkill cat似乎并不运动。

4

2 回答 2

7

我已经接受杰里米的回答是正确的,但对于任何好奇的人来说,这里是我最终得到的完整脚本:

#!/bin/bash

exec 3<>/dev/tcp/$1/$2         

control_c()
{
    kill $CAT_PID
    exit $?
}

trap control_c SIGINT

cat <&3 &                      
CAT_PID=$!
cat >&3
于 2012-08-27T19:21:38.277 回答
4

这是一个可怕的组合,但你可以产生一个子shell,所以像这样:

CAT1_PID=$$
echo CAT1_PID > /tmp/CAT1_PID
exec cat <&3 &

然后,当然,如果该脚本的多个副本碰巧正在运行,您就会遇到竞争条件。

根据您的外壳,您可能能够在 PS 列表中调用某种形式的 exec 和“重命名”cat。那么你就可以

pkill the_cat_that_ate_the_network
于 2012-08-25T00:01:01.940 回答