SSH_MSG_CHANNEL_REQUEST exec 后 sshd 是否将数据发送到标准输入

Does sshd sends data into stdin after SSH_MSG_CHANNEL_REQUEST exec

我正在编写必须执行远程 shell 命令的软件部分。此命令等待来自 stdin 的一些附加信息以继续执行。

这里是远程程序test_interactive.sh:

#!/bin/sh

echo -n "Please, enter a string: "

read string         # <-- Wait here for the input to come...
if [ -z "$string" ] ; then
    echo "1. You entered empty string." 1>&2
else
    echo "1. Your string: $string"
fi

此时我正在使用 SSH_MSG_CHANNEL_REQUEST exec 消息开始执行我的命令。然后在 window 调整和成功消息之后,我发送 SSH_MSG_CHANNEL_DATA 以及我想被推送到我程序的 stdin 的数据 通过 sshd 服务器。事实证明,我的程序在 stdin.

上没有收到任何信息

SSH_MSG_CHANNEL_REQUEST exec 导致 sshd 进程产生两个额外的进程 sshd(63023) 和 test_interactive(63024)。

进程test_interactive*(63024)有以下文件描述符:

下面是引导我进入状态的消息序列,在该状态下我正在发送消息但没有从我的程序接收任何内容:

Send:    'SSH_MSG_CHANNEL_OPEN session'
Receive: 'SSH_MSG_CHANNEL_OPEN_CONFIRMATION 0'
Send:    'SSH_MSG_CHANNEL_REQUEST exec'
Receive: 'SSH_MSG_CHANNEL_WINDOW_ADJUST'
Receive: 'SSH_MSG_CHANNEL_SUCCESS'
Receive: 'SSH_MSG_CHANNEL_DATA Please, enter a string:'
Send:    'SSH_MSG_CHANNEL_DATA hello'  <-- communication stops here

我应该如何指示 sshd 将数据推入它通过 SSH_MSG_CHANNEL_DATA 接收的标准输入?我试图通过查看 sshd 的源代码找到它,但它很大,我认为我需要数周时间才能弄清楚:)

最终完成的请求组合

如果您执行以下操作,守护程序 sshd 会将数据推送到 stdin

  1. 在“SSH_MSG_CHANNEL_REQUEST exec”之后立即发送“SSH_MSG_CHANNEL_DATA Hello World
  2. 在“SSH_MSG_CHANNEL_DATA Hello World”之后立即发送“SSH_MSG_CHANNEL_EOF

或者更具体地说:

Send:    'SSH_MSG_CHANNEL_REQUEST exec'
Send:    'SSH_MSG_CHANNEL_DATA Hello World'
Send:    'SSH_MSG_CHANNEL_EOF'
Receive: 'SSH_MSG_CHANNEL_DATA Please, enter a string:'
Receive: 'SSH_MSG_CHANNEL_REQUEST exit-status'
Receive: 'SSH_MSG_CHANNEL_DATA Please, enter a string: 1. Your string: Hello\n'
Receive: 'SSH_MSG_CHANNEL_EOF'
Receive: 'SSH_MSG_CHANNEL_CLOSE'
Send:    'SSH_MSG_CHANNEL_CLOSE'
Send:    'SSH_MSG_DISCONNECT'

这并没有解决问题,但提供了一些关于 sshd 行为的更多信息。我仍然需要能够根据我遇到的事情为该计划形成我的信息,而不是一劳永逸。

顺便说一下,添加 rfc4254 标签会很酷 ;) ↓

Kenster 的帮助下,我找到了答案。

是的,sshd 在 'SSH_MSG_CHANNEL_REQUEST exec'.

之后将数据发送到 stdin

但是您需要小心发送的内容。在我的例子中,形成响应消息的方法从流中删除了 '\n' 字符。 shell 函数 read 需要此字符才能继续。