PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Userrechte in cgi-bin



kMax
09.07.06, 15:24
Hallo Forum,
ich habe folgendes Problem:
Ich möchte mittels eines Bash-cgi-Skripts die erste Zeile von TEXTDATEI_1 unter die letzte Zeile von TEXTDATEI_2 hängen.
Dazu verwende ich folgende Befehle:

# Fügt Zeile 1 aus Datei 1 unter die letzte Zeile von Datei 2
head -n1 TEXTDATEI_1 >> TEXTDATEI_2

# löscht die erste Zeile aus Datei 1
sed -i 1D TEXTDATEI_1

Beide Befehle erfüllen in folgenden Fällen ihren Dienst:
1) Wenn ich sie als User im homedir ausführe
2) Wenn ich sie als root irgendwo ausführe

Da ich beide Befehle als cgi-skript aufrufen möchte habe ich folgende Dateien in den Ordner
/srv/www/cgi-bin kopiert. (Ich verwende Apache)

-rw-rw-rw- 1 root root 64 2006-07-09 15:51 TEXTDATEI_1
-rw-rw-rw- 1 root root 28 2006-07-09 15:54 TEXTDATEI_2
-rwxr-xr-x 1 root root 245 2006-07-09 15:51 vt.cgi

Das cgi-skript (vt.cgi) sieht so aus:

#!/bin/sh
echo 'Content-type: text/html'
echo
echo "<html><head><title>Skript</title></head><body>"
echo "<pre>"
head -n1 TEXTDATEI_1 >> TEXTDATEI_2
sed -i 1D TEXTDATEI_1
echo "<pre>"
echo "</body></html>"

Nun das Problem:
Wenn ich das skript mittels http://localhost/cgi-bin/vt.cgi aufrufe wird zwar "head" erfolgreich ausgeführt, aber "sed" scheint nicht zu funktionieren da TEXTDATEI_1 unverändert bleibt. Führe ich vt.cgi per Hand in einer root-shell aus funktioniert es. Führe ich es als User in einer shell aus, so meldet sed:
sed: couldn't open temporary file ./sedUBoQN8: Keine Berechtigung

Ich verstehe nicht weshalb ich als User mit ">>" Dateien verändern kann, mit "sed" aber nicht.

Wäre toll wenn mir das jemand erklären kann.
Danke.

delmonico
09.07.06, 15:34
Führe ich es als User in einer shell aus, so meldet sed:
sed: couldn't open temporary file ./sedUBoQN8: Keine Berechtigung

Vermutlich hat der User keine Schreibrechte in dem Verzeichnis... chown/chgrp/chmod helfen :)

gruss, Chris

kMax
09.07.06, 15:40
Aber wenn der User keine Schreibrechte in dem Verzeichniss hat, warum kann er dann

head -n 1 TEXTDATEI_1 >> TEXTDATEI_2

ausführen?

Damit schreibt er doch in TEXTDATEI_2.

Diozaka
09.07.06, 15:58
Die Option -i erstellt eine temporäre Datei um darin die Modifikationen zu machen und benennt sie dann einfach so wie die Ursprungsdatei. Wenn du kein Schreibrecht in dem Ordner hast, kann er diese Datei nicht erstellen -- du kannst aber vorhandene Dateien mit den richtigen Rechten bearbeiten. Um nicht an den Rechten des Ordners herumfummeln zu müssen, kannst du einfach selbst eine (leere) Temp-Datei (im Beispiel DATEI.tmp) mit den richtigen Rechten erstellen und im Script folgendes machen:
sed 1D DATEI > DATEI.tmp
cp DATEI.tmp DATEI
... oder du änderst eben die Rechte des Ordners. ;)

MfG, Diozaka

kMax
09.07.06, 16:32
Hi Diozaka,
danke für die Erläuterung der Funktionsweise des Befehls. So etwas in der Art habe ich mit gedacht. Ursprünglich hatte ich das Problem wie folgt realisiert:

Bitte nicht auslachen, ich fand den Befeh genial:
:)
tail -n $(expr `wc -l "$1" | awk '{print $1}'` - 1) DATEI > DATEI.tmp
cp DATEI.tmp DATEI

Da ich den Weg über die tmp-Datei umgehen wollte habe ich nach Alternativen gesucht. Aber mir scheint es geht nur so.

Nochmals Danke und liebe Grüße,
Max

Diozaka
09.07.06, 18:34
Bitte nicht auslachen, ich fand den Befeh genial:
:)
tail -n $(expr `wc -l "$1" | awk '{print $1}'` - 1) DATEI > DATEI.tmp
cp DATEI.tmp DATEIHehe, so kommt man auch mit unkonventionellen Mitteln zum Ziel. :)

MfG, Diozaka