运行shell脚本(它本身在另一台服务器上运行shell /命令)的CGI不返回输出

时间:2012-04-02 21:47:21

标签: linux perl shell ssh cgi

好的,我知道这是一个非常罕见的案例,但我真的很感激你对此的明智评论。

我正在使用CGI(Perl / SSH)开发监控/运营网络gui,以监控20多个服务器。大部分工作已经完成,我已经准备好了shell脚本,我们正在自动化大部分内容。无论如何,我们被说服为我们所做的监控和自动化工作提供前端。

长话短说,我使用服务器之一作为运行CGI的主要网关。 我的计划是什么,在这台服务器上,我使用Perl CGI来运行shell脚本,例如使用qx()函数并将输出放在一个文件中。 shell脚本将连接到其他服务器并运行该命令。问题是当我在SSH中运行cgi或shell脚本它工作正常并打印输出但是当我通过web调用cgi时它只返回到CGI服务器的shell输出(我连接到的那个不在那里)而使用SSH工作正常)。

这是CGI代码:

#!/usr/bin/perl -w
use strict;
use CGI;
use Shell;

my $query = new CGI;
print $query->header(-charset=>'utf-8');

 my $value=qx(sh dspace91.sh > space.txt);
 open(FILE, '<space.txt') or die "Can't read file [$!]\n";

 while (<FILE>){
 $document = $document .  $_;
 }

 close FILE;
 my $gdate=qx(date);

 print  "<div id='black' style='color:white'><pre>$document</pre>Information generated on <font color='#00CC00'>$gdate</font></div>";

这是shell脚本代码(dspace91.sh文件)

#!/bin/bash

expect -c 'spawn ssh -q username@serverIP "df -h"; expect password ; send "password\n" ; interact; ';

exit;

我假设问题是使用I / O环境变量。与STDOUT有关。虽然不确定!

这是我通过SSH运行CGI时的输出:

spawn ssh -q username@serverIP df -h
username@serverIP's password:
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2              20G  7.1G   12G  39% /
/dev/sda7              90G   25G   61G  29% /iwa
/dev/sda6             4.9G  1.3G  3.4G  28% /oracle
/dev/sda3              10G  595M  8.9G   7% /var
/dev/sda1              99M   45M   49M  48% /boot
tmpfs                  16G     0   16G   0% /dev/shm
drst002:/logs         400G  274G  127G  69% /backup-logs
drst002:/unix         7.0T  5.2T  1.9T  74% /unix

当我通过web gui运行它时输出:

spawn ssh -q username@serverIP df -h
username@serverIP's password: 

Information generated on Tue Apr 3 02:21:47 IRDT 2012

任何想法的人?

1 个答案:

答案 0 :(得分:2)

一些想法:

  • 使用ssh 公钥认证,无需使用expect。

    expect是一个讨厌的黑客,永远不会证明足够可靠。

  • 尝试:

    expect -c '...' 2>&1

  • 也是,但我不认为是这种情况,CGI通常会遇到麻烦,因为它们的运行方式与开发人员在命令行上测试的用户不同。请务必检查这是否会影响您的设置。

相关问题