【问题标题】:How to redirect command I/O to nc two-way?如何将命令 I/O 重定向到 nc 双向?
【发布时间】:2018-03-12 22:33:37
【问题描述】:

我正在尝试使用nc 以符合 POSIX 的方式执行this 之类的操作,在给出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"

我有两个问题,请同时回答:

    1234563仅在输入上使用管道,也仅在输出上使用管道,但两种方法都不起作用。这个cat 解决方案的缺点是当您在连接到操作员机器后退出命令时,它仍然使进程在远程机器上保持活动状态,需要被杀死。我想知道为什么重定向解决方案不起作用?以及如何解决退出问题?尽管cat 解决方案不是最优雅的解决方案,但如果它能够工作,也是可以接受的。
  1. 有没有办法使用 fd 而不是 mkfifo 进行双向 I/O 重定向?例如,使用exec 3&gt; dummy?记住它必须符合 POSIX,所以&gt;(:) 是不可接受的。

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

【问题讨论】:

    标签: shell io pipe


    【解决方案1】:

    您正在尝试做一个反向外壳?我不能完全从逻辑上判断。

    关于 fifo 的一些事情 - 打开 fifo 会阻塞,直到 两边都打开 - 即如果您打开读取,您将被阻塞,直到有人打开它进行写入,反之亦然。

    它不适用于重定向的原因是重定向的打开发生在启动nc之前的shell中,因此直到一个进程打开同一个fifo的写入端,它才会'不能打开同一个fifo的读端。在这种情况下,你对阻塞有着致命的拥抱:

    nc 被阻止打开 "$out",因为还没有人打开它进行阅读。

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

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

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

    即我们确保inout 的打开顺序与命令的顺序相同,这应该可以解决fifo 打开问题。

    您不需要使用两个 fifo 来执行此操作,您可以使用一个来完成它:

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

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

    debian 上的 nc 手册页包含以下示例,用于“相反”解释:

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

    这是我用来做一个更简单的猫答案的方法;虽然它似乎也可以省略领先的猫:

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

    【讨论】:

    • 你肯定是对的:sh -i 2&gt;&amp;1 &lt; "$out" | nc 192.168.0.10 9999 &gt; "$out" 工作正常
    • 如果我愿意,我可以通过关注this 来完成理想的行为;
    猜你喜欢
    • 2021-11-09
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    相关资源
    最近更新 更多