Tips en Trucs 2014

CGI en Apache voorbeelden

Introductie

CGI (Common Gateway Interface) is een koppeling tussen een browser en de webserver die een CGI script/programma uitvoert. CGI is oud en wordt vandaag verdrongen door verschillende programmeertalen zoals PHP, enz. Toch kan een systeembeheerder er gebruik van maken om via de browser een systeem te volgen en/of aan te passen. We bekijken in deze tip hoe je eenvoudige CGI scripts geschreven in verschillende programmeertalen met behulp van de Apache web server kunt uitvoeren.

Apache installeren

De Apache webserver installeer je met de opdracht:

dany@linux-18zg:~> sudo zypper install apache2
root's password:
Gegevens van installatiebron laden...
Lezen van geïnstalleerde pakketten...
Afhankelijkheden tussen pakketten oplossen...

De volgende 5 NIEUWE pakketten zullen worden geïnstalleerd:
  apache2 apache2-prefork apache2-utils libapr1 libapr-util1 

Het volgende aanbevolen pakket was automatisch geselecteerd:
  apache2-prefork 

5 nieuw te installeren pakketten.
Totale downloadgrootte: 1,5 MiB Na de operatie zal aanvullend 4,7 MiB worden 
gebruikt.
Doorgaan? [j/n/? alle opties tonen] (j): 
pakket libapr1-1.4.8-3.2.1.x86_64 wordt opgehaald
                                          (1/5),  92,8 KiB (216,6 KiB uitgepakt)
Ophalen: libapr1-1.4.8-3.2.1.x86_64.rpm .................................[klaar]
pakket libapr-util1-1.5.2-3.1.3.x86_64 wordt opgehaald
                                          (2/5),  89,0 KiB (229,1 KiB uitgepakt)
Ophalen: libapr-util1-1.5.2-3.1.3.x86_64.rpm ............................[klaar]
pakket apache2-utils-2.4.6-6.15.1.x86_64 wordt opgehaald
                                          (3/5), 110,8 KiB (216,9 KiB uitgepakt)
Ophalen: apache2-utils-2.4.6-6.15.1.x86_64.rpm ..........................[klaar]
pakket apache2-2.4.6-6.15.1.x86_64 wordt opgehaald
                                         (4/5), 1000,0 KiB (  3,5 MiB uitgepakt)
Ophalen: apache2-2.4.6-6.15.1.x86_64.rpm ....................[klaar (2,2 MiB/s)]
pakket apache2-prefork-2.4.6-6.15.1.x86_64 wordt opgehaald
                                          (5/5), 234,8 KiB (582,9 KiB uitgepakt)
Ophalen: apache2-prefork-2.4.6-6.15.1.x86_64.rpm ........................[klaar]
(1/5) Installeert: libapr1-1.4.8-3.2.1 ..................................[klaar]
(2/5) Installeert: libapr-util1-1.5.2-3.1.3 .............................[klaar]
(3/5) Installeert: apache2-utils-2.4.6-6.15.1 ...........................[klaar]
(4/5) Installeert: apache2-2.4.6-6.15.1 .................................[klaar]
Aanvullende rpm-uitvoer:
/usr/sbin/suexec2: cannot verify root:root 0755 - not listed in /etc/permissions
Updating /etc/sysconfig/apache2...
looking for old 2.0 modules to be renamed...
!!ATTENTION! authz_default was removed from apache version 2.4 or later, CHECK YOUR CONFIGURATION!!!
Done.


(5/5) Installeert: apache2-prefork-2.4.6-6.15.1 .........................[klaar]

De Apache 2 webserver werkt met een standaard configuratie in het bestand /etc/apache2/default-server.conf. Deze configuratie kan je bekijken met de opdracht:

dany@linux-18zg:~> more /etc/apache2/default-server.conf
...
# ScriptAlias: This controls which directories contain server scripts.
# ScriptAliases are essentially the same as Aliases, except that
# documents in the realname directory are treated as applications and
# run by the server when requested rather than as documents sent to the client.
# The same rules about trailing "/" apply to ScriptAlias directives as to
# Alias.
#
ScriptAlias /cgi-bin/ "/srv/www/cgi-bin/"

# "/srv/www/cgi-bin" should be changed to whatever your ScriptAliased
# CGI directory exists, if you have that configured.
#

        AllowOverride None
        Options +ExecCGI -Includes
        Order allow,deny
        Allow from all

...

Waaruit blijkt dat de CGI scripts in de map /srv/www/cgi-bin/ staan en in de browser bereikbaar zijn via het adres /cgi-bin/.

De Apache 2 webserver start je met de volgende opdracht:

dany@linux-18zg:~> sudo systemctl start apache2

En om de Apache webserver bij het opstarten van het systeem automatisch te starten, voer je de volgende extra opdracht uit:

dany@linux-18zg:~> sudo systemctl enable apache2
root's password:
ln -s '/usr/lib/systemd/system/apache2.service' '/etc/systemd/system/multi-user.target.wants/apache2.service'

Hoewel de Apache webserver reeds draait, belet de firewall andere computers de toegang tot de webserver. Open de HTTP firewall poort voor de webserver met de opdracht:

dany@linux-18zg:~> sudo /sbin/yast2 firewall services add zone=EXT service=service:apache2

Bash CGI script

CGI werkt met verschillende talen, we beginnen met een Bash script. Start een editor met root rechten:

dany@linux-18zg:~> sudo joe /srv/www/cgi-bin/bash.sh

en typ het volgende script:

#!/bin/bash
echo "Content-type: text/html"
echo ''
echo 'CGI Bash Voorbeeld'

Sla dit script op door de toetscombinatie Ctrl + K + X te drukken.

Maak het script uitvoerbaar met de opdracht:

dany@linux-18zg:~> sudo chmod 755 /srv/www/cgi-bin/bash.sh

Bekijk in de browser de uitvoer van het Bash CGI script door te surfen naar het IP adres van uw webserver aangevuld met de URL van uw CGI map en de naam van het uit te voeren CGI bestand. Het IP adres van de webserver kan je opvragen met de opdracht:

dany@linux-18zg:~> ip a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eno16777736:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:0f:67:d7 brd ff:ff:ff:ff:ff:ff
    inet 192.168.240.129/24 brd 192.168.240.255 scope global eno16777736
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe0f:67d7/64 scope link 
       valid_lft forever preferred_lft forever
CGI Bash

Om de gebruikte schijfruimte weer te geven, pas je het CGI Bash script als volgt aan:

#!/bin/bash
echo "Content-type: text/html"
echo ''
echo 'CGI Bash Voorbeeld<br />'
echo `df -h / | grep -v Filesystem`

Perl CGI script

Maak het script /srv/www/cgi-bin/perl.pl aan en zorg dat het script uitvoerbaar is:

#!/usr/bin/perl

print "Content-type: text/html\n\n";
print <<htmlcode;
<html>
<head>
<title>CGI Perl Voorbeeld</title>
</head>
<body>
<h1>CGI Perl Voorbeeld</h1>
<p>CGI Perl Voorbeeld</p>
</body>
htmlcode

C CGI programma

Om C en C++ te compileren, moeten we de compiler installeren met de opdracht:

dany@linux-18zg:~> sudo zypper install gcc-c++
root's password:
Gegevens van installatiebron laden...
Lezen van geïnstalleerde pakketten...
Afhankelijkheden tussen pakketten oplossen...

De volgende 12 NIEUWE pakketten zullen worden geïnstalleerd:
  binutils gcc gcc48 gcc48-c++ gcc-c++ glibc-devel libasan0 libatomic1 libitm1 
  libstdc++48-devel libtsan0 linux-glibc-devel 

12 nieuw te installeren pakketten.
Totale downloadgrootte: 20,4 MiB Na de operatie zal aanvullend 100,3 MiB worden 
gebruikt.
Doorgaan? [j/n/? alle opties tonen] (j): 
pakket linux-glibc-devel-3.11-2.1.15.noarch wordt opgehaald
                                         (1/12), 891,0 KiB (  3,6 MiB uitgepakt)
Ophalen: linux-glibc-devel-3.11-2.1.15.noarch.rpm ...........[klaar (1,3 MiB/s)]
pakket binutils-2.23.2-8.1.2.x86_64 wordt opgehaald
                                         (2/12),   3,6 MiB ( 23,1 MiB uitgepakt)
Ophalen: binutils-2.23.2-8.1.2.x86_64.rpm ...................[klaar (2,4 MiB/s)]
pakket libasan0-4.8.1_20130909-3.2.1.x86_64 wordt opgehaald
                                         (3/12),  68,1 KiB (166,9 KiB uitgepakt)
Ophalen: libasan0-4.8.1_20130909-3.2.1.x86_64.rpm .......................[klaar]
pakket libatomic1-4.8.1_20130909-3.2.1.x86_64 wordt opgehaald
                                         (4/12),  14,6 KiB ( 26,1 KiB uitgepakt)
Ophalen: libatomic1-4.8.1_20130909-3.2.1.x86_64.rpm .....................[klaar]
pakket libitm1-4.8.1_20130909-3.2.1.x86_64 wordt opgehaald
                                         (5/12),  34,2 KiB (130,4 KiB uitgepakt)
Ophalen: libitm1-4.8.1_20130909-3.2.1.x86_64.rpm ........................[klaar]
pakket libtsan0-4.8.1_20130909-3.2.1.x86_64 wordt opgehaald
                                         (6/12), 100,5 KiB (298,6 KiB uitgepakt)
Ophalen: libtsan0-4.8.1_20130909-3.2.1.x86_64.rpm .......................[klaar]
pakket glibc-devel-2.18-4.11.1.x86_64 wordt opgehaald
                                         (7/12), 625,8 KiB (  2,9 MiB uitgepakt)
Ophalen: glibc-devel-2.18-4.11.1.x86_64.rpm .............................[klaar]
pakket libstdc++48-devel-4.8.1_20130909-3.2.1.x86_64 wordt opgehaald
                                         (8/12),   2,8 MiB ( 23,5 MiB uitgepakt)
Ophalen: libstdc++48-devel-4.8.1_20130909-3.2.1.x86_64.rpm ..[klaar (2,5 MiB/s)]
pakket gcc48-4.8.1_20130909-3.2.1.x86_64 wordt opgehaald
                                         (9/12),   7,7 MiB ( 32,6 MiB uitgepakt)
Ophalen: gcc48-4.8.1_20130909-3.2.1.x86_64.rpm ..............[klaar (2,8 MiB/s)]
pakket gcc48-c++-4.8.1_20130909-3.2.1.x86_64 wordt opgehaald
                                        (10/12),   4,7 MiB ( 13,9 MiB uitgepakt)
Ophalen: gcc48-c++-4.8.1_20130909-3.2.1.x86_64.rpm ..........[klaar (2,6 MiB/s)]
pakket gcc-4.8-2.1.2.x86_64 wordt opgehaald
                                          (11/12),   4,8 KiB (    0 B uitgepakt)
Ophalen: gcc-4.8-2.1.2.x86_64.rpm .......................................[klaar]
pakket gcc-c++-4.8-2.1.2.x86_64 wordt opgehaald
                                          (12/12),   4,5 KiB (    0 B uitgepakt)
Ophalen: gcc-c++-4.8-2.1.2.x86_64.rpm ...................................[klaar]
( 1/12) Installeert: linux-glibc-devel-3.11-2.1.15 ......................[klaar]
( 2/12) Installeert: binutils-2.23.2-8.1.2 ..............................[klaar]
Aanvullende rpm-uitvoer:
update-alternatives: using /usr/bin/ld.bfd to provide /usr/bin/ld (ld) in auto mode


( 3/12) Installeert: libasan0-4.8.1_20130909-3.2.1 ......................[klaar]
( 4/12) Installeert: libatomic1-4.8.1_20130909-3.2.1 ....................[klaar]
( 5/12) Installeert: libitm1-4.8.1_20130909-3.2.1 .......................[klaar]
( 6/12) Installeert: libtsan0-4.8.1_20130909-3.2.1 ......................[klaar]
( 7/12) Installeert: glibc-devel-2.18-4.11.1 ............................[klaar]
( 8/12) Installeert: libstdc++48-devel-4.8.1_20130909-3.2.1 .............[klaar]
( 9/12) Installeert: gcc48-4.8.1_20130909-3.2.1 .........................[klaar]
(10/12) Installeert: gcc48-c++-4.8.1_20130909-3.2.1 .....................[klaar]
(11/12) Installeert: gcc-4.8-2.1.2 ......................................[klaar]
(12/12) Installeert: gcc-c++-4.8-2.1.2 ..................................[klaar]

Na de installatie typ je onderstaande C code in die je opslaat als c.c in uw persoonlijke map:

#include <stdio.h>
int main(void)
{
printf("Content-Type: text/plain \n\n");
printf("CGI C Voorbeeld \n");
}

Deze C code compileer je met de opdracht:

dany@linux-18zg:~> sudo gcc -o /srv/www/cgi-bin/c c.c

Surf naar http://192.168.240.129/cgi-bin/c om het C programma te starten en de uitvoer in de browser weer te geven.

C++ CGI programma

Schrijf de volgende C++ code en sla deze op in het bestand cpp.c in uw persoonlijke map:

#include <iostream>
using namespace std;

int main()
{
        cout << "content-type: text/html" << endl << endl;
        cout << "<h1>CGI C++ voorbeeld</h1>" << endl;
        return 0;
}

Compileer de C++ code met de opdracht:

dany@linux-18zg:~> sudo g++ -o /srv/www/cgi-bin/cpp cpp.c

Daarna kan je het C++ programma uitvoeren door te surfen naar het adres http://192.168.240.129/cgi-bin/cpp.

Conclusie

Hoewel CGI oud is, kan je er handig gebruik van maken om beheerstaken op een Linux systeem op afstand te controleren en te beheren via een eenvoudige browser.