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:
- 在“SSH_MSG_CHANNEL_REQUEST exec”之后立即发送“SSH_MSG_CHANNEL_DATA Hello World”
- 在“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 需要此字符才能继续。
我正在编写必须执行远程 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:
- 在“SSH_MSG_CHANNEL_REQUEST exec”之后立即发送“SSH_MSG_CHANNEL_DATA Hello World”
- 在“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 需要此字符才能继续。