从网站执行 bash 脚本时出现问题

从网站执行 bash 脚本时出现问题

我刚刚开始用 bash 编写脚本,并将其中一些脚本放在我的 Web 服务器上(该服务器位于我的虚拟 Debian 6.0.4 机器上)。

我已经在这台机器上安装了lighttpd。当我执行例如以下命令时:

TOP=`top -n 1`;
PS=`ps aux`;

echo "that's top\n" $TOP;
echo "ps\n" $PS;

没有任何内容被打印$TOP,因为$PS文本是在没有行分隔的情况下编写的(所有内容都写在一行中)。我怎样才能改变这个?

答案1

plain 的输出top不适合在终端以外的任何设备上显示。您应该使用该-b开关来获取纯文本输出。

并且行尾字符将被您正在执行的 shell 删除(替换为空格) - 您没有理由将这些输出存储在变量中,您只需在需要时运行这些命令即可。

我假设您将数据返回到网络浏览器。如果确实如此,如果您希望有机会正确显示输出,则应该执行一些最小的 HTML 格式设置。

尝试类似的方法:

#! /bin/sh
echo -e "Content-type: text/html\n"
echo "<html><body>"
echo "<h1>top</h1>"
echo "<pre>"
top -b -n 1
echo "</pre>"
echo "<h1>ps</h1>"
echo "<pre>"
ps aux
echo "</pre>"
echo "</body></html>"

答案2

您的输出未显示的原因是您没有遵循CGI协议。您必须在任何其他输出之前发送服务器响应标头。

TOP=`top -n 1`;
PS=`ps aux`;

echo "Content-Type: text/plain"  # response header
echo ""                          # end of headers
echo "that's top\n" $TOP;
echo "ps\n" $PS;

使用 text/plain 将提供您想要的格式,但不会提供超链接等 HTML 用法。为此,请使用:

TOP=`top -n 1`
PS=`ps aux`

echo "Content-Type: text/html"
echo ""
echo "<html>"
echo "<head><title>command output</title></head>"
echo "<body>that's top<br/>"
echo "<pre>$TOP</pre>"
echo "<br/>ps<br/>"
echo "<pre>$PS</pre>"
echo "</body>"

答案3

如果这是在终端中运行的,当您回显它们时,您需要在变量周围加上引号以保留换行符。

TOP=`top -b -n 1`;
PS=`ps aux`;

echo "that's top";
echo "$TOP";
echo "ps";
echo "$PS";

如果输出发送到网页,那么您还需要 pre 标记

TOP=`top -b -n 1`;
PS=`ps aux`;
echo "<pre>";
echo "that's top";
echo "$TOP";
echo "ps";
echo "$PS";
echo "</pre>";

相关内容