在bash中实现netcat

问题描述 投票:0回答:3

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

#!/bin/bash

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

cat <&3 &                      
cat <&1 >3

它的问题是它留下了一个需要杀死的挂猫进程,但我无法找到一种自动方法来执行此操作,并且手动运行

pkill cat
看起来并不那么有趣。

bash netcat
3个回答
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

4
投票

这是一个可怕的拼凑,但你可以生成一个子 shell 之类的东西:

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

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

根据您的 shell,您也许能够调用某种形式的 exec 并在 PS 列表中“重命名”cat。那你就可以了

pkill the_cat_that_ate_the_network

0
投票

只是后续问题...

whois() {
        (
                exec 3<>/dev/tcp/whois.ripe.net/43
                echo "$*" >&3
                cat <&3
        )
}

以防万一您有一个非常简单的协议(例如 WHOIS)。

© www.soinside.com 2019 - 2024. All rights reserved.