作为 CGI 执行脚本时缺少详细输出

作为 CGI 执行脚本时缺少详细输出

这是我的 shell 脚本

#!/bin/bash
echo "Content-type: text/plain"
echo ""

sshpass -p $pass ssh -v -p $port -t -o StrictHostKeyChecking=no root@$ip "cd / && ls && exit"

它可以通过网络或命令行执行。

通过命令行执行时,我会看到很多输出,包括来自“-v”(详细模式)的调试信息等。

但是当通过网络执行时,我看到的只是文件夹列表(执行命令的输出)。没有其他数据。

当我通过网络执行此脚本时,为什么扩展数据丢失了?为什么当我通过命令行执行它时它在那里?

我怎样才能确保它在通过网络执行时也存在?

答案1

您的脚本正在将“额外数据”发送到标准错误,而不是标准输出。

为什么当我通过网络执行此脚本时扩展数据丢失?

因为seb服务器和你的脚本之间使用的CGI接口只采用你脚本的标准输出考虑流,而不是其标准错误溪流。标准错误正在其他地方,可能到网络服务器的错误日志,也可能无处可去。

当我通过命令行执行它时为什么它在那里?

因为在终端中,标准输出和标准错误默认情况下位于同一位置,即终端本身。

我怎样才能确保它在通过网络执行时也存在?

您可以将标准错误重定向到与标准输出相同的位置:

exec 2>&1

(文件描述符 2 是标准错误,文件描述符 1 是标准输出。)

相关内容