【问题标题】:CGI script skipping source commandCGI 脚本跳过源命令
【发布时间】:2015-10-22 15:27:13
【问题描述】:

我正在尝试编写一个可以编写 html 文件的 cgi,这样我就不必每次想查看信息时都运行脚本。

#!/bin/bash

echo "Content-type: text/html"
echo ""
echo "<HTML>"
echo "<head><title>Status</title></head>"
echo "<body>"
./auto.sh > ../secure/status.html
echo "Redirecting..."
echo "<script language="javascript">window.location.href="../secure/status.html";</script>"
echo "</body></HTML>"

但是,当我将浏览器定向到页面时,页面源显示了这一点,但它没有运行重定向命令,甚至没有重定向...

<HTML>
<head><title>Status</title></head>
<body>
Redirecting...
<script language=javascript>window.location.href = ../secure/status.html;</script>
</body></HTML>

我做错了什么? 谢谢!!

编辑:这是我的 auto.sh

#!/bin/bash

echo "<HTML><head><title>Status</title></head><body><pre>"
echo "$(date)"
echo ""
FAILED=$(sudo cat /var/log/secure | grep "$(date +"%b %d")" | grep "sshd" | grep "Failed")
ACCEPTED=$(sudo cat /var/log/secure | grep "$(date +"%b %d")" | grep "sshd" | grep "Accepted")
SPEED=$(python /script/speedtest-cli --server 4128 | grep "Download:\|Upload:")
BAN=$(sudo cat /var/log/fail2ban.log | grep "$(date +"%Y-%m-%d")" | grep "Ban")

echo "##########FAILED##########"
echo "$FAILED"
echo ""
echo "##########ACCEPTED##########"
echo "$ACCEPTED"
echo ""
echo "##########BANNED##########"
echo "$BAN"
echo ""
echo "##########SPEED##########"
echo "$SPEED"
echo ""
echo "##########STORAGE##########"
echo "$(df -h)"
echo ""
echo "##########MEMORY##########"
echo "$(free -m)"
echo ""
echo "<a href="../cgi-bin/status.cgi">Refresh</a>"
echo "</pre></body></HTML>"

【问题讨论】:

  • 1) 你不需要echo "$(free -m)",只需free -m。 2)自动脚本已经打印出标题,所以cgi脚本不必。
  • cgi脚本运行时不想看到auto.sh,只想保存成html文件。

标签: bash shell cgi


【解决方案1】:

我会将重定向代码(包括脚本标签)放在文档的&lt;head&gt; 中。

我还将修改 bash 脚本,以便将目标放在双引号中(将输出呈现为)window.location.href="../secure/status.html"; 单引号也可以。似乎您对引号的 bash 脚本使用没有像您尝试做的那样引用项目。

最后,如果您希望用户真正看到“重定向”一词,您应该在 javascript 代码中调用某种时间延迟。

尝试: echo "&lt;script type='text/javascript'&gt;window.location.href='../secure/status.html';&lt;/script&gt;"

我提取了您的 auto.sh 文件的一小部分,然后将其输出重定向到一个文件。

#!/bin/bash
# subset of your file auto.sh

echo "<HTML><head><title>Status</title></head><body><pre>"
echo "$(date)"
echo ""
FAILED="Failed"
ACCEPTED="Accepted"
BAN="Ban"
echo "##########FAILED##########"
echo "$FAILED"
echo ""
echo "##########ACCEPTED##########"
echo "$ACCEPTED"
echo ""
echo "##########BANNED##########"
echo "$BAN"
echo ""
echo '<a href="../cgi-bin/status.cgi">Refresh</a>'
echo "</pre></body></HTML>"

注意 href 行中的单引号。

然后,我在命令行上执行了这个: sh auto.sh &gt; status.html

最后,我执行了cat status.html 并得到了这个...

<HTML><head><title>Status</title></head><body><pre>
Thu, Oct 22, 2015  3:09:43 PM

##########FAILED##########
Failed

##########ACCEPTED##########
Accepted

##########BANNED##########
Ban

<a href="../cgi-bin/status.cgi">Refresh</a>
</pre></body></HTML>

这是你想要做的吗?

【讨论】:

  • 在我的实际脚本中,我将它放在双引号中,页面源代码只是没有显示它们。我将重定向行移到头部,但它没有做任何事情......
  • 我试过单引号,现在它重定向了!!谢谢。它仍然没有写入 status.html ......
  • 根据您的原始帖子,我阅读了手册页,因为我以前从未听说过 tee 命令。在参考页computerhope.com/unix/utee.htm 中,它确实表明tee 写入文件。由于我还没有使用过 tee,所以我总是通过回显一些文本并使用单个大于号 &gt; 进行覆盖重定向或使用双大于 &gt;&gt; 进行重定向来编写文件。
  • 您是否有可能在 auto.sh 的输出被重定向到同一文件的同时(或接近它)向文件添加文本?也许信息被无意中覆盖了。
  • 嗯,不知道有没有关注你...我觉得html文件只有一件事相关联?有没有更好的方法来解决这个问题?我只是想将输出发送到一个文件,所以我不必每次查看它时都运行脚本。
猜你喜欢
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-10
  • 2013-10-01
相关资源
最近更新 更多