我正在编写一个可以从命令行和网页运行的Perl脚本.该脚本接收几个参数,如果它从命令行开始,则通过$ ARGV读取这些参数,如果从网页开始,则从CGI读取这些参数.我怎样才能做到这一点?
my $username;
my $cgi = new CGI;
#IF CGI
$username = $cgi->param('username');
#IF COMMAND LINE
$username = $ARGV[0];
Run Code Online (Sandbox Code Playgroud) 在Windows上运行时,我在使用Perl CGI脚本分析进程时遇到了一些问题.主要问题似乎是在Windows上运行时模拟"fork",并且实际上似乎并没有创建新进程(只是当前的另一个线程).这意味着等待进程完成的Web服务器(如IIS)将继续等待"后台"进程完成.
有没有办法从Windows下的CGI脚本中分离后台进程?更好的是,我可以调用一个以跨平台方式执行此操作的功能吗?
(只是为了让生活变得更加困难,我真的想要一个将分叉进程输出重定向到文件的好方法).
我最近发现CGI脚本几乎可以用任何可以打印到stdout的语言编写.我写了一个小的guile cgi脚本,可以在我的本地apache安装上运行,但不能在我的共享主机上运行:
#!/usr/local/bin/guile -s
!#
(display "Content-Type: text/html")
(newline)
(newline)
(display "hi")
(newline)
Run Code Online (Sandbox Code Playgroud)
当我通过ssh从主机上的shell运行脚本时,这是输出:
$ ./scheme.cgi
Content-Type: text/html
hi
Run Code Online (Sandbox Code Playgroud)
所以,显然我的主机安装了guile.但是,当我尝试在浏览器中访问此文件时,出现"500 Internal Server Error".查看我的错误日志时,我发现我遇到了可怕的"脚本标头过早结束"错误:
[server.com] [Tue Aug 17 00:54:19 2010] [error] [client xx.xx.xx.xxx] (2)No such file or directory:
exec of '/home/www/vhosts/jcw.geekisp.com/cgi-bin/scheme.cgi' failed
[server.com] [Tue Aug 17 00:54:19 2010] [error] [client xx.xx.xx.xxx] Premature end
of script headers: scheme.cgi
Run Code Online (Sandbox Code Playgroud)
因为我在共享主机上,使用mod_lisp或guile的fastcgi实现是不可能的.话虽这么说,这可能是什么问题?类似的cgi脚本我用python,perl,ruby和sh编写的服务器上没有错误.我看到主机上安装了guile 1.8.7,但我的本地机器是最新版本.
我知道这是一个令人难以置信的小众问题,任何帮助将不胜感激!
我的问题如下.密码被识别为有效后我需要重定向到main.cgi但是我收到的消息为:
Status: 302 Found
Location: http://localhost/cgi-bin/Main.cgi
Run Code Online (Sandbox Code Playgroud)
我知道这样做的原因是我之后正在写这个语句,Content-Type所以它将它作为HTML并在屏幕上打印.我是Perl的新手.任何人都可以帮我找到解决方案,让我的代码按照我想要的方式工作吗?或者请为我建议一些替代代码,或任何可能帮助我的链接.
#!C:\perl\bin\perl.exe
use strict;
use CGI qw(:standard);
use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
use DBI;
my $q = new CGI;
print "Content-Type: text/html\n\n";
if ($q->param("Login")) {
my $Password = param('Password');
if (!$Password) {
print "Please Enter the Password";
} else {
my $dbh = DBI->connect(
"dbi:SQLite:DEVICE.db",
"", "",
{
RaiseError => 1,
AutoCommit => 1
}
);
my $sth = $dbh->prepare("select * from Settings where Password = ?");
$sth->execute($Password);
if (my $pass …Run Code Online (Sandbox Code Playgroud) 我已经读过你的网络服务器出了问题,这可能导致在网络浏览器中将PHP脚本显示为纯文本文件; 因此,我将大多数PHP脚本移动到Web根目录之外的目录中.现在我一直想知道我的cgi-bin中的CGI脚本是否会发生同样的情况.
我主要关心的是一个包含MySQL数据库用户名和密码的脚本.如果这是一个可能的安全漏洞(至少就数据库内容而言),是否有办法将敏感数据放在不同的位置并从那里获取(如将其保存在不同目录的文件中并阅读它来自那个文件,例如)?我的脚本是用Perl btw编写的.
我正在寻找用C和CGI编写一些应用程序,现在我已经实现了URI编码/解码,HTML实体编码/解码,查询/ cookie解析器等基本功能.我需要管理会话.我该怎么做?例如,PHP如何管理会话?
通常我从网页获取数据但我想从命令行发送它以方便调试.
为了得到数据,我做了类似的事情:
my $query = new CGI;
my $username = $query->param("the_username");
Run Code Online (Sandbox Code Playgroud)
这似乎不起作用:
$ ./script.pl the_username=user1
实际上以上的作品.if检查的语句$username是错误的(使用==而不是eq).
我有一个Perl CGI应用程序,有时超时,导致它被Apache杀死,并将504 Gateway Time-out错误发送到浏览器.我试图使用NYTProf来描述这个应用程序,但我无法读取配置文件数据:
$ nytprofhtml -f www/cgi-local/nytprof.out
Reading www/cgi-local/nytprof.out
Profile data incomplete, inflate error -5 ((null)) at end of input file, perhaps the process didn't exit cleanly or the file has been truncated (refer to TROUBLESHOOTING in the documentation)
Run Code Online (Sandbox Code Playgroud)
我正在使用sigexit=1NYTProf选项.这是重现问题的最小CGI脚本:
#!/usr/bin/perl -d:NYTProf
sleep 1 while 1;
Run Code Online (Sandbox Code Playgroud) 我遇到了一个问题,我最近搬到了一个vps.我正在尝试运行python cgi脚本,但我得到一个apache脚本标头的过早结束错误.
(我chmod + x脚本文件)
该脚本非常简单:
#!/usr/bin/env python
import cgi, cgitb
cgitb.enable()
print "Content-type: text/html"
print "<html><body>hello scritp</body></html>"
Run Code Online (Sandbox Code Playgroud)
现在如果我将脚本命名为test**.py**它在服务器上运行良好.但是,如果我以正确的方式执行,请将其称为测试**.cgi**我收到内部服务器错误.
我从终端运行脚本
./test.cgi
Run Code Online (Sandbox Code Playgroud)
我没有错
Content-type: text/html
<html><body>hello scritp</body></html>
Run Code Online (Sandbox Code Playgroud)
有没有人遇到过这个问题?并为它的解决方案?:)干杯
当我使用Chrome或Firefox调用CGI脚本(GET请求)时,我注意到在Apache访问日志中,在几秒钟之后,生成了HEAD请求和具有相同URI的GET请求.为了确保它不是我的Apache设置的特性,我写了一个简单的Perl脚本并将其安装在我的ISP网站上.每次调用时间,URI,用户代理,远程地址和端口时,此脚本只会自己记录到磁盘文件:
#!/usr/bin/perl -wT
use strict;
use CGI;
my $cgi = new CGI;
print $cgi->header(-type=>'text/plain', -expires=>'-1d');
print "hello";
open (LOG, ">>printenv2.txt");
my ($sec, $min, $hr, $day, $mon, $year) = localtime;
my $timestamp = sprintf("%02d/%02d/%04d %02d:%02d:%02d", $mon + 1, $day, 1900 + $year, $hr, $min, $sec);
print LOG $timestamp, "\n";
my @keys = qw(REQUEST_METHOD REQUEST_URI HTTP_USER_AGENT REMOTE_ADDR REMOTE_PORT);
foreach (@keys) {
print LOG "$_ = $ENV{$_}\n";
}
print LOG "\n";
close LOG;
Run Code Online (Sandbox Code Playgroud)
我用http://localhost/friends/forms/cgi/printenv2.cgi调用了一次脚本?arg = 1
该脚本运行了三次,但最后两次运行在我的初始调用后超过14秒.这是日志的输出:
09/11/2015 19:25:26
REQUEST_METHOD …Run Code Online (Sandbox Code Playgroud)