CGI, который запускает скрипт оболочки (который сам запускает оболочку / команду на другом сервере), не возвращает вывод - PullRequest
0 голосов
/ 03 апреля 2012

Хорошо, ребята, я знаю, что это довольно редкий случай, но я действительно был бы признателен за ваши мудрые комментарии по этому поводу.

Я разрабатываю веб-интерфейс для мониторинга / работы с использованием CGI (Perl / SSH) для мониторинга более 20 серверов. Большая часть работы выполнена, я подготовил сценарии оболочки, и мы автоматизируем большую часть материала там. В любом случае, нас убеждают предоставить интерфейс для того, что мы сделали для мониторинга и автоматизации.

Короче говоря, я использую один из серверов в качестве основного шлюза для запуска CGI. Каков мой план, на этом сервере я использую Perl CGI для запуска сценариев оболочки, используя, например, функцию qx () и помещаю вывод в файл. сценарий оболочки подключится к другим серверам и запустит команду. проблема в том, что когда я запускаю сценарий cgi или shell в SSH, он работает нормально и печатает вывод, но когда я вызываю cgi через web, он возвращает только до тех пор, пока не будет выведен вывод оболочки сервера CGI (тот, к которому я подключаюсь, отсутствует в то время как с SSH он работает нормально).

вот код CGI:

<code>#!/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
Информация, сгенерированная в $ gdate ";

и вот код сценария оболочки (файл dspace91.sh)

#!/bin/bash

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

exit;

Я предполагаю, что проблема заключается в работе с переменными среды ввода / вывода. что-то делать с STDOUT. хотя не уверен!

это вывод при запуске CGI через SSH:

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

это вывод при запуске через веб-интерфейс:

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

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

Любые люди идеи?

1 Ответ

2 голосов
/ 03 апреля 2012

Некоторые идеи:

  • Используйте ssh аутентификацию с открытым ключом и избавьте от необходимости использовать ожидаемо.

    expect - это неприятнохак, который никогда не оказывается достаточно надежным.

  • try:

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

  • также, но я неНе думаю, что это так , CGI обычно сталкиваются с проблемами, потому что они работают от имени другого пользователя, чем тот, с которым разработчик тестирует в командной строке.Всегда проверяйте, может ли это повлиять на ваши настройки.

...