CGI: Unterschied zwischen den Versionen

Aus Hostsharing Wiki
Zur Navigation springen Zur Suche springen
(Übernommen aus alter Dokumentation.)
 
KKeine Bearbeitungszusammenfassung
 
(4 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{Baustelle}}
Alle WEB-Pakete bei Hostsharing erlauben die Ausführung von Skripten auf dem Server. (außer SW-Pakete) Dabei gibt es mehrere Möglichkeiten, zum einen direkt in den Webserver eingebundene Module, zum anderen die Ausführung über CGI (Common Gateway Interface). Letzteres ist keine eigene Skriptsprache, sondern nur eine Schnittstelle, über die Daten an eine Skriptsprache, wie z.B. perl oder [[PHP|php]] übergeben werden können. Solche Daten könnten z.B. die abgerufene URL, Zugriff auf Cookies etc. sein. Über die Schnittstelle CGI können Skriptsprachen wie [[Perl]], [[Python]] oder [[PHP]], sowie selbst kompilierte Binär-Programme ausgeführt werden.
[[Kategorie:HSDoku]]
[[Kategorie:WWW]]
 
Alle Dynamic-Pakete bei Hostsharing erlauben die Ausführung von Skripten auf dem Server. Dabei gibt es mehrere Möglichkeiten, zum einen direkt in den Webserver eingebundene Module wie mod_php für die Skriptsprache PHP, zum anderen die Ausführung über CGI (Common Gateway Interface). Letzteres ist keine eigene Skriptsprache, sondern nur eine Schnittstelle, über die Daten an eine Skriptsprache, wie z.B. perl oder php übergeben werden können. Solche Daten könnten z.B. die abgerufene URL, Zugriff auf Cookies etc. sein. Über die Schnittstelle cgi können Skriptsprachen wie Perl oder auch PHP, aber auch selbst kompilierte Binär-Programme ausgeführt werden.


CGI-Skripte liegen bei Hostsharing in einem Verzeichnisbaum direkt unter der Domain in einem Verzeichnis mit dem Namen cgi, also parallel zu den Verzeichnissen etc, subs und var. Von Seiten der URL werden sie als /cgi-bin eingeblendet. Ein Script, das unter ~/doms/example.com/cgi/ liegt, wird also über http://www.example.com/cgi-bin/ angesprochen.
CGI-Skripte liegen bei Hostsharing in einem Verzeichnisbaum direkt unter der Domain in einem Verzeichnis mit dem Namen cgi, also parallel zu den Verzeichnissen etc, subs und var. Von Seiten der URL werden sie als /cgi-bin eingeblendet. Ein Script, das unter ~/doms/example.com/cgi/ liegt, wird also über http://www.example.com/cgi-bin/ angesprochen.


Ein kleines Beispiel soll uns zeigen, was CGI eigentlich leistet. Dazu erstellen wir die Datei settings.cgi in unserem cgi-Verzeichnis mit folgendem Inhalt:
Ein kleines Beispiel soll uns zeigen, was CGI eigentlich leistet. Dazu erstellen wir die Datei test.cgi in unserem CGI-Verzeichnis mit folgendem Inhalt:


  #!/bin/sh
<syntaxhighlight lang=shell line>
  echo Content-type: text/plain
#!/bin/sh
  echo
echo Content-type: text/plain
  set  
echo
set  
</syntaxhighlight>


Nach dem Abspeichern müssen wir die Datei noch als ausführbar markieren (dies muss beides mit dem Domain-Admin-Account gemacht werden, da nur der an das cgi-Verzeichnis herankommt):
Nach dem Abspeichern müssen wir die Datei noch als ausführbar markieren (dies muss beides mit dem Domain-Admin-Account gemacht werden, da nur der an das CGI-Verzeichnis herankommt):


  xyz00-hans@hopi$ chmod +x ~/doms/example.com/cgi/settings.cgi
<syntaxhighlight lang=shell>
xyz00-hans@h01$ chmod +x ~/doms/example.com/cgi/test.cgi
</syntaxhighlight>


Dieses kleine Skript macht nichts weiter, als in einem HTTP-Header dem Browser mitzuteilen, dass es sich um einfachen Text handelt und ihn dann zu veranlassen, die gesamten Parameter auszugeben, die über die CGI-Schnittstelle als Umgebungsvariable mitgegeben wurden.
Dieses kleine Skript macht nichts weiter, als in einem HTTP-Header dem Browser mitzuteilen, dass es sich um einfachen Text handelt und ihn dann zu veranlassen, die gesamten Parameter auszugeben, die über die CGI-Schnittstelle als Umgebungsvariable mitgegeben wurden.


Ein Aufruf der URL http://www.example.com/cgi-bin/settings.cgi erzeugt also in etwa folgende Ausgabe:
Ein Aufruf der URL http://www.example.com/cgi-bin/test.cgi erzeugt also in etwa folgende Ausgabe:
<syntaxhighlight lang=shell line>
BASH=/bin/sh
BASH_ARGC=()
BASH_ARGV=()
BASH_LINENO=([0]="0")
BASH_SOURCE=([0]="test.cgi")
BASH_VERSINFO=([0]="3" [1]="1" [2]="17" [3]="1" [4]="release" [5]="i486-pc-linux-gnu")
BASH_VERSION='3.1.17(1)-release'
DIRSTACK=()
DOCUMENT_ROOT=/home/doms/example.com/htdocs
EUID=20085
GATEWAY_INTERFACE=CGI/1.1
GROUPS=()
HOSTNAME=h01.hostsharing.net
HOSTTYPE=i486
HTTP_ACCEPT='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
HTTP_ACCEPT_CHARSET='ISO-8859-1,utf-8;q=0.7,*;q=0.7'
HTTP_ACCEPT_ENCODING=gzip,deflate
HTTP_ACCEPT_LANGUAGE='de-de,de;q=0.8,it;q=0.7,it-ch;q=0.5,en-us;q=0.3,en;q=0.2'
HTTP_CONNECTION=keep-alive
HTTP_HOST=www.example.com
HTTP_KEEP_ALIVE=300
HTTP_USER_AGENT='Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10'
IFS='
'
MACHTYPE=i486-pc-linux-gnu
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/bin:/usr/bin:/bin
PIPESTATUS=([0]="0")
POSIXLY_CORRECT=y
PPID=28217
PS4='+ '
PWD=/home/pacs/xyz00/doms/example.com/cgi
QUERY_STRING=
REMOTE_ADDR=84.139.46.155
REMOTE_PORT=62438
REQUEST_METHOD=GET
REQUEST_URI=/cgi-bin/test.cgi
SCRIPT_FILENAME=/home/doms/example.com/cgi/test.cgi
SCRIPT_NAME=/cgi-bin/test.cgi
SCRIPT_URI=http://www.example.com/cgi-bin/test.cgi
SCRIPT_URL=/cgi-bin/test.cgi
SERVER_ADDR=83.223.95.29
SERVER_ADMIN=xyz00@h01.hostsharing.net
SERVER_NAME=www.example.com
SERVER_PORT=80
SERVER_PROTOCOL=HTTP/1.1
SERVER_SIGNATURE='<address>Apache/2.2.3 (Debian) mod_jk/1.2.18 mod_ssl/2.2.3 OpenSSL/0.9.8c Server at www.example.com Port 80</address>
'
SERVER_SOFTWARE='Apache/2.2.3 (Debian) mod_jk/1.2.18 mod_ssl/2.2.3 OpenSSL/0.9.8c'
SHELL=/bin/bash
SHELLOPTS=braceexpand:hashall:interactive-comments:posix
SHLVL=1
TERM=dumb
UID=20085
_=echo
</syntaxhighlight>


  HOSTNAME=hopi
{{Textkasten|gelb|Achtung|Eine typische Falle ist das Hochladen von Dateien mit MS-DOS Zeilenumbrüchen (CR/LF) statt UNIX Zeilenumbrüchen (LF). Da die erste Zeile in einem solchen Skript (hier #!/bin/sh) das Programm angibt, mit dem das Skript ausgeführt wird, wird schon das fehlschlagen, da sich am Ende der Zeile ein unsichtbares CR befinden wird. Der HTTP Fehler 500 (Internal Server Error) wird erscheinen. FTP bietet zu dem Zweck den ASCII-Mode an, der die Transformation zwischen den Systemen vornimmt. Binäre Dateien (z.B. Grafiken) sollten niemals, Skripte dagegen immer im ASCII-Modus übertragen werden.}}
  HOSTTYPE=i386
  HTTP_ACCEPT='text/html, image/png, image/jpeg, image/gif, image/x-xbitmap, */*'
  HTTP_ACCEPT_CHARSET='windows-1252;q=1.0, utf-8;q=1.0, utf-16;q=1.0, iso-8859-1;q=0.6, *;q=0.1'
  HTTP_ACCEPT_ENCODING='deflate, gzip, x-gzip, identity, *;q=0'
  HTTP_CGI_AUTHORIZATION=
  HTTP_CONNECTION='Keep-Alive, TE'
  HTTP_HOST=www.deineigenerdomainname.de
  HTTP_TE='deflate, gzip, chunked, identity, trailers'
  HTTP_USER_AGENT='Opera/6.0 (Linux 2.4.17 i686; U) [en]'
  ...
  QUERY_STRING=
  REMOTE_ADDR=62.156.160.59
  REMOTE_PORT=36344
  REQUEST_METHOD=GET
  REQUEST_URI=/cgi-bin/test.cgi
  SCRIPT_FILENAME=/home/doms/dynamic-webspace.de/cgi/test.cgi
  SCRIPT_NAME=/cgi-bin/test.cgi
  SCRIPT_URI=http://www.dynamic-webspace.de/cgi-bin/test.cgi
  SCRIPT_URL=/cgi-bin/test.cgi
  SERVER_ADDR=66.70.34.151
  SERVER_ADMIN=mih01@hopi.hostsharing.net
  SERVER_NAME=www.dynamic-webspace.de
  SERVER_PORT=80
  SERVER_PROTOCOL=HTTP/1.1
  SERVER_SOFTWARE='Apache/1.3.23 (Unix) Debian GNU/Linux mod_xslt/Xalan/1.0 mod_gzip/1.3.19.1a PHP/4.1.2 mod_auth_pam/1.0a mod_perl/1.26'


{{Textkasten|gelb|Achtung|Eine typische Falle ist das Hochladen von Dateien mit MS-DOS Zeilenumbrüchen (CR/LF) statt UNIX Zeilenumbrüchen (LF). Da die erste Zeile in einem solchen Skript (hier #!/bin/sh) das Programm angibt, mit dem das Skript ausgeführt wird, wird schon das fehlschlagen, da sich am Ende der Zeile ein unsichtbares CR befinden wird. Der HTTP Fehler 500 (Internal Server Error) wird erscheinen. FTP bietet zu dem Zweck den ASCII-Mode an, der die Transformation zwischen den Systemen vornimmt. Binäre Dateien (z.B. Grafiken) sollten niemals, Skripte dagegen immer im ASCII-Modus übertragen werden.}}
----
[[Kategorie:HSDoku]]
[[Kategorie:WWW]]
[[Kategorie:Glossar]]

Aktuelle Version vom 24. Juni 2024, 10:15 Uhr

Alle WEB-Pakete bei Hostsharing erlauben die Ausführung von Skripten auf dem Server. (außer SW-Pakete) Dabei gibt es mehrere Möglichkeiten, zum einen direkt in den Webserver eingebundene Module, zum anderen die Ausführung über CGI (Common Gateway Interface). Letzteres ist keine eigene Skriptsprache, sondern nur eine Schnittstelle, über die Daten an eine Skriptsprache, wie z.B. perl oder php übergeben werden können. Solche Daten könnten z.B. die abgerufene URL, Zugriff auf Cookies etc. sein. Über die Schnittstelle CGI können Skriptsprachen wie Perl, Python oder PHP, sowie selbst kompilierte Binär-Programme ausgeführt werden.

CGI-Skripte liegen bei Hostsharing in einem Verzeichnisbaum direkt unter der Domain in einem Verzeichnis mit dem Namen cgi, also parallel zu den Verzeichnissen etc, subs und var. Von Seiten der URL werden sie als /cgi-bin eingeblendet. Ein Script, das unter ~/doms/example.com/cgi/ liegt, wird also über http://www.example.com/cgi-bin/ angesprochen.

Ein kleines Beispiel soll uns zeigen, was CGI eigentlich leistet. Dazu erstellen wir die Datei test.cgi in unserem CGI-Verzeichnis mit folgendem Inhalt:

#!/bin/sh
echo Content-type: text/plain
echo
set

Nach dem Abspeichern müssen wir die Datei noch als ausführbar markieren (dies muss beides mit dem Domain-Admin-Account gemacht werden, da nur der an das CGI-Verzeichnis herankommt):

xyz00-hans@h01$ chmod +x ~/doms/example.com/cgi/test.cgi

Dieses kleine Skript macht nichts weiter, als in einem HTTP-Header dem Browser mitzuteilen, dass es sich um einfachen Text handelt und ihn dann zu veranlassen, die gesamten Parameter auszugeben, die über die CGI-Schnittstelle als Umgebungsvariable mitgegeben wurden.

Ein Aufruf der URL http://www.example.com/cgi-bin/test.cgi erzeugt also in etwa folgende Ausgabe:

BASH=/bin/sh
BASH_ARGC=()
BASH_ARGV=()
BASH_LINENO=([0]="0")
BASH_SOURCE=([0]="test.cgi")
BASH_VERSINFO=([0]="3" [1]="1" [2]="17" [3]="1" [4]="release" [5]="i486-pc-linux-gnu")
BASH_VERSION='3.1.17(1)-release'
DIRSTACK=()
DOCUMENT_ROOT=/home/doms/example.com/htdocs
EUID=20085
GATEWAY_INTERFACE=CGI/1.1
GROUPS=()
HOSTNAME=h01.hostsharing.net
HOSTTYPE=i486
HTTP_ACCEPT='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
HTTP_ACCEPT_CHARSET='ISO-8859-1,utf-8;q=0.7,*;q=0.7'
HTTP_ACCEPT_ENCODING=gzip,deflate
HTTP_ACCEPT_LANGUAGE='de-de,de;q=0.8,it;q=0.7,it-ch;q=0.5,en-us;q=0.3,en;q=0.2'
HTTP_CONNECTION=keep-alive
HTTP_HOST=www.example.com
HTTP_KEEP_ALIVE=300
HTTP_USER_AGENT='Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10'
IFS=' 	
'
MACHTYPE=i486-pc-linux-gnu
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/bin:/usr/bin:/bin
PIPESTATUS=([0]="0")
POSIXLY_CORRECT=y
PPID=28217
PS4='+ '
PWD=/home/pacs/xyz00/doms/example.com/cgi
QUERY_STRING=
REMOTE_ADDR=84.139.46.155
REMOTE_PORT=62438
REQUEST_METHOD=GET
REQUEST_URI=/cgi-bin/test.cgi
SCRIPT_FILENAME=/home/doms/example.com/cgi/test.cgi
SCRIPT_NAME=/cgi-bin/test.cgi
SCRIPT_URI=http://www.example.com/cgi-bin/test.cgi
SCRIPT_URL=/cgi-bin/test.cgi
SERVER_ADDR=83.223.95.29
SERVER_ADMIN=xyz00@h01.hostsharing.net
SERVER_NAME=www.example.com
SERVER_PORT=80
SERVER_PROTOCOL=HTTP/1.1
SERVER_SIGNATURE='<address>Apache/2.2.3 (Debian) mod_jk/1.2.18 mod_ssl/2.2.3 OpenSSL/0.9.8c Server at www.example.com Port 80</address>
'
SERVER_SOFTWARE='Apache/2.2.3 (Debian) mod_jk/1.2.18 mod_ssl/2.2.3 OpenSSL/0.9.8c'
SHELL=/bin/bash
SHELLOPTS=braceexpand:hashall:interactive-comments:posix
SHLVL=1
TERM=dumb
UID=20085
_=echo

Achtung

Eine typische Falle ist das Hochladen von Dateien mit MS-DOS Zeilenumbrüchen (CR/LF) statt UNIX Zeilenumbrüchen (LF). Da die erste Zeile in einem solchen Skript (hier #!/bin/sh) das Programm angibt, mit dem das Skript ausgeführt wird, wird schon das fehlschlagen, da sich am Ende der Zeile ein unsichtbares CR befinden wird. Der HTTP Fehler 500 (Internal Server Error) wird erscheinen. FTP bietet zu dem Zweck den ASCII-Mode an, der die Transformation zwischen den Systemen vornimmt. Binäre Dateien (z.B. Grafiken) sollten niemals, Skripte dagegen immer im ASCII-Modus übertragen werden.