好的,我知道这是一个非常罕见的案例,但我真的很感激你对此的明智评论。
我正在使用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
任何想法的人?
答案 0 :(得分:2)
一些想法:
使用ssh 公钥认证,无需使用expect。
expect
是一个讨厌的黑客,永远不会证明足够可靠。
尝试:
expect -c '...' 2>&1
也是,但我不认为是这种情况,CGI通常会遇到麻烦,因为它们的运行方式与开发人员在命令行上测试的用户不同。请务必检查这是否会影响您的设置。