通过 SSH 的多个 fifo

通过 SSH 的多个 fifo

Shell 脚本允许多个文件描述符(对于 POSIX 合规性最多 9 个,但对于 则更多bash):

$ install -m 755 /dev/stdin /tmp/test <<\EOF
#!/bin/sh

echo hi1 >&1
echo hi2 >&2
echo hi3 >&3
echo hi4 >&4
EOF
$ /tmp/test 1> /tmp/1 2> /tmp/2 3> /tmp/3 4> /tmp/4
$ cat /tmp/1
hi1
$ cat /tmp/2
hi2
$ cat /tmp/3
hi3
$ cat /tmp/4
hi4

我想通过 SSH 实现相同的行为,但发生的情况是:

$ ssh user@remote_machine /tmp/test 1> /tmp/1 2> /tmp/2 3> /tmp/3 4> /tmp/4
$ cat /tmp/1
hi1
$ cat /tmp/2
hi2
/tmp/test: 5: /tmp/test: 3: Bad file descriptor
/tmp/test: 6: /tmp/test: 4: Bad file descriptor
$ cat /tmp/3
$ cat /tmp/4

stdout除了和之外,是否可以通过 SSH 拥有多个输出管道stderr

重要的是要注意,我不是在寻找端口转发,因为我会遇到网络问题。

答案1

不,那是不可能的。客户ssh端显式关闭每个打开的大于 2 的文件描述符:

/*
 * Discard other fds that are hanging around. These can cause problem
 * with backgrounded ssh processes started by ControlPersist.
 */
closefrom(STDERR_FILENO + 1);

这几乎是客户端启动时发生的第一件事(参见main()OpenSSH 8.0 的源代码可以在这里找到)。

相关内容