Problema com o script bash executado a partir do website

1

Acabei de começar a escrever scripts no bash e estou colocando alguns deles no meu servidor web (que está localizado na minha máquina virtual Debian 6.0.4).

Instalei o lighttpd nessa máquina.e quando executo, por exemplo, este comando:

TOP='top -n 1';
PS='ps aux';

echo "that's top\n" $TOP;
echo "ps\n" $PS;

Nada é impresso como $TOP e, para $PS , o texto é gravado sem separação para linhas (tudo está escrito em uma única linha). Como posso mudar isto ?

    
por Patryk 19.02.2012 / 13:39

3 respostas

3

A saída do% normal top não é adequada para exibição em nada além de um terminal. Você deve usar a opção -b para obter saída de texto simples.

E os caracteres de fim de linha serão retirados (substituídos por espaços) pelo seu shell com o que você está fazendo - não há razão para você armazenar essas saídas em variáveis, você pode simplesmente executar esses comandos quando precisar eles.

Estou assumindo que você está retornando os dados para um navegador da web. Se esse é realmente o caso, você deve fazer uma formatação HTML mínima se quiser ter a chance de exibir a saída corretamente.

Tente algo como:

#! /bin/sh
echo -e "Content-type: text/html\n"
echo "<html><body>"
echo "<h1>top</h1>"
echo "<pre>"
top -b -n 1
echo "</pre>"
echo "<h1>ps</h1>"
echo "<pre>"
ps aux
echo "</pre>"
echo "</body></html>"
    
por 19.02.2012 / 14:20
3

O motivo pelo qual sua saída não é exibida é porque você não está seguindo o protocolo CGI . Você deve enviar cabeçalhos de resposta do servidor antes de qualquer outra saída.

TOP='top -n 1';
PS='ps aux';

echo "Content-Type: text/plain"  # response header
echo ""                          # end of headers
echo "that's top\n" $TOP;
echo "ps\n" $PS;

Usar text / plain fornecerá a formatação desejada, mas não fornecerá o uso de HTML como hiperlinks. Para isso, use:

TOP='top -n 1'
PS='ps aux'

echo "Content-Type: text/html"
echo ""
echo "<html>"
echo "<head><title>command output</title></head>"
echo "<body>that's top<br/>"
echo "<pre>$TOP</pre>"
echo "<br/>ps<br/>"
echo "<pre>$PS</pre>"
echo "</body>"
    
por 19.02.2012 / 14:37
1

Se isso foi executado em um terminal, quando você faz eco deles, é necessário colocar aspas ao redor da variável para manter os caracteres de nova linha.

TOP='top -b -n 1';
PS='ps aux';

echo "that's top";
echo "$TOP";
echo "ps";
echo "$PS";

Se a saída for enviada para uma página da Web, você também precisará das tags pré

TOP='top -b -n 1';
PS='ps aux';
echo "<pre>";
echo "that's top";
echo "$TOP";
echo "ps";
echo "$PS";
echo "</pre>";
    
por 19.02.2012 / 14:41