Introdução
CGI (Common Gateway Interface) é uma das formas mais diretas de executar scripts dinâmicos em servidores web. É simples, funcional e ainda muito útil para cenários onde controle, leveza e independência de frameworks são prioridade. Em vez de depender de containers, linguagens específicas ou estruturas engessadas, o CGI permite que você escreva scripts em Bash, Python, Perl ou PHP puro, e os execute com apenas um Apache e permissões corretas.
1. Habilitando o CGI no Apache
Para sistemas baseados em Debian/Ubuntu:
a2enmod cgi
systemctl restart apache2
Configurando o VirtualHost com suporte a CGI:
Edite o arquivo de configuração do seu VirtualHost (por exemplo, /etc/apache2/sites-available/000-default.conf
):
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Require all granted
</Directory>
Reinicie o Apache:
systemctl restart apache2
2. Criando um CGI básico em Shell (Hello World)
Crie um script:
vi /usr/lib/cgi-bin/hello.sh
Conteúdo:
#!/bin/bash
echo "Content-Type: text/plain"
echo ""
echo "CGI funcionando!"
Dê permissão de execução:
chmod +x /usr/lib/cgi-bin/hello.sh
Acesse pelo navegador:
http://SEU_SERVIDOR/cgi-bin/hello.sh
3. Lendo um CSV do Asterisk e gerando JSON via CGI
Motivo
O Asterisk salva os registros de chamadas no Master.csv
. Vamos expor isso como JSON para uso em painéis, relatórios ou APIs simples.
Criação do script cdr2json.sh
:
vi /usr/lib/cgi-bin/cdr2json.sh
Conteúdo:
#!/bin/bash
echo "Content-Type: application/json"
echo ""
CSV="/var/www/html/api/Master.csv"
HEADERS=$(head -1 "$CSV")
awk -F, -v headers="$HEADERS" '
BEGIN {
split(headers, keys, ",")
print "["
}
NR > 1 {
printf " {"
for (i = 1; i <= NF; i++) {
gsub(/^"|"$/, "", $i)
printf "\"%s\":\"%s\"", keys[i], $i
if (i < NF) printf ","
}
printf "}"
if ((getline > 0) && NR < 100) print ","; else print ""
}
END {
print "]"
}
' "$CSV"
Permissões:
chmod +x /usr/lib/cgi-bin/cdr2json.sh
4. Criando cópia segura do Master.csv
Evite que o Apache leia diretamente o arquivo original do Asterisk:
mkdir -p /var/www/html/api/
cp /var/log/asterisk/cdr-csv/Master.csv /var/www/html/api/Master.csv
chmod 644 /var/www/html/api/Master.csv
Agendando com cron:
crontab -e
Adicione:
* * * * * cp /var/log/asterisk/cdr-csv/Master.csv /var/www/html/api/Master.csv && chmod 644 /var/www/html/api/Master.csv
* * * * * Significa de 60 em 60 segundos
5. CGI com PHP puro (sem PHP-FPM)
Crie o script:
vi /usr/lib/cgi-bin/cdr.php
Conteúdo:
#!/usr/bin/php-cgi
<?php
header("Content-Type: application/json");
$csvFile = '/var/www/html/api/Master.csv';
if (!file_exists($csvFile)) {
http_response_code(404);
echo json_encode(["erro" => "Arquivo não encontrado"]);
exit;
}
$fp = fopen($csvFile, 'r');
$headers = fgetcsv($fp);
$data = [];
$limite = 100;
while (($row = fgetcsv($fp)) !== false && $limite-- > 0) {
$item = [];
foreach ($headers as $i => $coluna) {
$item[trim($coluna)] = $row[$i] ?? null;
}
$data[] = $item;
}
fclose($fp);
echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
Permissão:
chmod +x /usr/lib/cgi-bin/cdr.php
Acesse:
http://SEU_SERVIDOR/cgi-bin/cdr.php
6. Segurança no CGI
- Nunca confie em input direto do usuário.
- Evite interpretar comandos com
eval
,system
,exec
,bash -c
. - Faça
sanitize
dos parâmetros, mesmo em scripts simples. - Use usuários diferentes sempre que possível.
- Restrinja permissões ao mínimo necessário.
- Prefira copiar arquivos sensíveis para leitura, como feito com o
Master.csv
.
7. Headers HTTP obrigatórios
Todo CGI precisa retornar os headers corretos. Exemplo mínimo:
echo "Content-Type: application/json"
echo ""
O echo ""
separa os headers do corpo. Sem isso, o Apache retorna erro 500.
8. Quando CGI é a melhor escolha
- Ambientes embarcados (ex: roteadores).
- Servidores com poucos recursos.
- Scripts internos de administração.
- APIs simples que não precisam de autenticação robusta ou escalabilidade massiva.
- Cenários em que você quer controle absoluto, sem amarras de frameworks ou dependências externas.
9. Exemplo real no ar
Se o Apache estiver configurado corretamente e o Master.csv
estiver sendo espelhado, acessar:
http://SEU_SERVIDOR/cgi-bin/cdr2json.sh
Ou
http://SEU_SERVIDOR/cgi-bin/cdr.php
Retornará o JSON das ligações.
Conclusão
CGI é direto, funcional e extremamente útil para quem sabe o que está fazendo. Você elimina dependências, aumenta a transparência da aplicação e mantém controle absoluto sobre cada byte trafegado. Com um Apache e um shell script, você já consegue construir APIs inteiras — leves, rápidas e independentes.