【问题标题】:how to use stdin on perl cgi如何在 perl cgi 上使用标准输入
【发布时间】:2025-12-17 01:20:08
【问题描述】:

我是 perl 新手,我想在我的脚本中使用屏幕输入。这是我的脚本,我希望从键盘输入 IOS 命令。有人能告诉我哪里错了吗?我现在遇到的问题是脚本没有读取我的键盘输入,我不确定我的情况是否有效。谢谢!!

# ### Show ######################################################### 
               $cmd = <STDIN>;
                chomp ($cmd);
               $show_error = "";
              if ($ssh_switch eq 'yes') {
                   ssh_access();
               }
               print "\n",h2($host . ' - ' . $cmd);
                @output=$cmd;
                print hr(),"\n";
               }
}
#########################################################################

【问题讨论】:

    标签: perl cgi


    【解决方案1】:

    CGI 旨在接收完整的 HTTP 请求,然后发出完整的 HTTP 响应。

    它根本无法交互工作。

    如果您想编写需要键盘输入的脚本,请不要使用 CGI。

    【讨论】:

    • 不是真的。 CGI 可以从任意文件中读取参数,或者您可以自己读取它们并将它们提供给 CGI 并使用该模块生成 HTML 输出,而无需涉及 HTTP。
    【解决方案2】:

    事实上,CGI 确实使用了STDIN。它用于传递POST 请求的正文。试试这个脚本

    #!/usr/bin/perl
    print "Content-Type: text/plain\r\n\r\nYou entered: ";
    print while <STDIN>;
    

    POST 一些数据,例如

    $ echo "Just test" | POST http://localhost/yourscript.pl
    You entered: Just test
    

    POST 是来自LWP CPAN 发行版的程序)

    因此,您可以使用从STDIN 读取的命令来指导您的脚本,尽管它本身非常不安全!

    【讨论】:

    • 这确实是测试 CGI 的常用方法 - 通过在命令行上运行它们,将输入管道输入到标准输入并查看标准输出上打印的内容。
    • 感谢您的宝贵时间。您是否看到可以在我的脚本中添加任何行。我是perl学习者,了解不多。我想运行简单的命令,所以不用担心安全性。
    【解决方案3】:

    CGI 允许通过 STDIN 输入;试试CGI-&gt;new(\*STDIN)

    虽然它可能不是你想要的输入方式。你能举例说明你的输入是什么样的吗?

    啊,在我看来你也想这样做:

    1. 从命令行运行您的脚本,例如:perl scriptname 'Submit=1&amp;Devices=router1&amp;Devices=router2',然后在 STDIN 上提供您的 cisco 命令(并获取 html 输出,这可能不方便),或者

    2. 在浏览器中运行您的脚本,在这种情况下,您应该使用输入标签替换 STDIN 用法以输入命令并从该命名参数中获取命令

    再看一遍,我看到你已经有一个输入标签“搜索”,你只是没有使用它。 尝试将&lt;STDIN&gt; 替换为$cgi-&gt;param('search') 并将搜索添加到“确保输入数据”检查中。

    【讨论】:

    • 非常感谢您抽出宝贵时间,我想运行不同的 cisco 命令,例如“显示版本”或“显示接口”等。作为输入,然后我想在多个路由器上运行该命令。
    • 我对第二种方法非常感兴趣。您介意告诉我脚本中的哪一行我应该更正/编辑以执行您的建议吗?再次感谢您的宝贵时间。
    • 这是我编辑的,# ### 从屏幕输入 - 确保输入数据 if ($cgi->param('Submit') ne "" and $cgi->param( 'Devices') ne "" and $cgi->param('search')) { ---- 然后 $cmd = $cgi->param('search'); ## 脚本运行,但也没有输出我在页面上看到这个错误( Pragma: no-cache Content-Type: text/html; charset=ISO-8859-1 ) - 看起来有一些进展,因为登录顺利但是没有输出,可能是测试输入没有通过设备。
    • 只是为了让您知道开始工作,非常感谢您的帮助。我现在唯一的问题是,我无法在多个设备上运行脚本。我的脚本中有这一行“-multiple => 'true',”,但不确定为什么它无效。