这是我的 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 是标准输出。)