Skript lässt sich nicht ausführen

stebu

New Member
Ich habe eine Skript in /etc/init.d erstellt, mit dem ich die Firewall konfiguriere. Die Datei ist vorhanden, sie lässt sich aber nicht ausführen.

debian-Bs:/etc/init.d# ls -l firewall-konfig_Bs
-rwxr-xr-x 1 root root 750 2007-01-03 01:06 firewall-konfig_Bs
debian-Bs:/etc/init.d# firewall-konfig_Bs start
-bash: firewall-konfig_Bs: command not found

Nebenbei: Der Dateiname wird mit dem Tabulator auch nicht automatisch ergänzt.

Wo liegt der Fehler?
 
Es ist so wie Darkdream geschrieben hat, Du kannst das Script aber auch mit
Code:
/etc/init.d/firewall-konfig_Bs start
ausführen. Für mögliche Cronjobs ist diese Schreibweise die besser.
 
Danke für die Hinweise. Es funktionieren tatsächlich beide Varianten! Interessant ist aber folgendes: apache2 liegt im gleichen Verzeichnis. Diese Datei lässt sich ohne den absoluten Pfad oder ./ starten, warum?
debian-Bs:/etc/init.d# apache2 -k restart

Interessante ist diese Frage für mich, weil ich mit
update-rc.d firewall--konfig_Bs defaults das Skript als Startskript installieren will. Der Befehl wird auch tatsächlich ausgeführt, aber beim Neustart hat die Firewall nicht die Konfiguration, welche ich mit dem manuellen Aufruf erreiche. Die Firewall hat immer noch die früheren Standardeinstellungen.

Die Rechte sehen identisch aus:
debian-Bs:/etc/init.d# ls -l apache2
-rwxr-xr-x 1 root root 3583 2006-07-28 11:07 apache2
debian-Bs:/etc/init.d# ls -l firewall-konfig_Bs
-rwxr-xr-x 1 root root 750 2007-01-03 01:06 firewall-konfig_Bs
 
Kurze Erklärung:
Dein Apache liegt höchstwahrscheinlich in einem Verzeichnis, welches in deinem PATH liegt.

Längere (bessere) Erklärung.
Auf deinem Server gibt es verschiedene Verzeichnis, in denen ausführbare Programme liegen. Die Verzeichnis sind in der $PATH-Variable gespeichert (kann man sich mit: "echo $PATH" anzeigen lassen).
Wenn Du nun unter /etc/init.d den Befehl "apache2 -k restart" ausführst, dann schaut dein System ob es in den entsprechenden Verzeichnissen diese ausführbare Datei gibt und führt diese Datei aus.
Mal beispielhaft:
"echo $PATH" ergibt folgende Ausgabe:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
das heißt:
In den Verzeichnissen "/usr/local/sbin", "/usr/local/bin", ... liegen ausführbare Dateien. Der Befehl "apache2" liegt wahrscheinlich in einem der entsprechenden Verzeichnisse (z.B. /usr/local/bin).
Bist Du nun in einem Verzeichnis, welches nicht im PATH ist (z.B. /etc/init.d) und dort ist auch eine ausführbare Datei Namens "apache2" und Du tippst einfach "apache2 -k restart" dann wird nicht die Datei /etc/init.d/apache2 ausgeführt sondern /usr/local/bin/apache2. Du hast also nur den Eindruck, es würde /etc/init.d/apache2 ausgeführt.
Willst Du /etc/init.d/apache2 ausführen und bist im Verzeichnis /etc/init.d dann musst Du ./apache2 eintippen.
Auf den Sonderfall, dass der "." im PATH vorhanden ist, will ich jetzt nicht eingehen, macht man meiner Meinung nach nicht.

Bei Fragen noch einmal nachfragen.
 
Danke für die Antwort. Ich habe tatsächlich eine apache2 an einem anderen Ort. Nun habe ich aber neue Fragen:
1. Gibt es eine Möglichkeit bei einem Befehl wie oben herauszufinden, in welchem Verzeichnis die Datei lag (ausser dass ich manuell alle Pfade durchsuche).
2. Manuell lässt sich ./Firewall-konfig_Bs start aufrufen und es funktioniert. Ich habe dann wie in den früheren Beiträgen beschrieben, mit update-rc-d Firewall-konfig_Bs defaults aufgerufen um das Skript bereits beim Start ablaufen zu lassen. Das klappt nicht. Ich vermute dass der Paramter start nicht mitgegeben wird (ohne einen Parameter ist das Skript so eingestellt, dass es eine Hilfeseite angibt). Meine Fragen:
a) Kann ich irgendwo sehen/prüfen ob das Skript aufgerufen wurde und welche echo Ausgabe es gemacht hat?
b) Gemäss man update-rc.d wird start/stop selber hinzugefügt. Ist das so?
c) Ich könnte mir auch vorstellen, dass bei Debian das Standardskript nachher aufgerufen wird uns so meine Einstellungen überschreibt. Wie werden die Standardeinstellungen eingespielt, wenn man Debian 3.1r4 frisch installiert?
 
Last edited by a moderator:
1. Gibt es eine Möglichkeit bei einem Befehl wie oben herauszufinden, in welchem Verzeichnis die Datei lag (ausser dass ich manuell alle Pfade durchsuche).
Ja, gibt es. "which" z.B. "which apache2"
Lösche aber nichts. In init.d liegen Init-Scripts und unter /bin und so Binaries.

a) Kann ich irgendwo sehen/prüfen ob das Skript aufgerufen wurde und welche echo Ausgabe es gemacht hat?
Unter /var/log mal in "debug" und "syslog" schauen.

b) Gemäss man update-rc.d wird start/stop selber hinzugefügt. Ist das so?
Ich denke schon. Warum auch nicht.

c) Ich könnte mir auch vorstellen, dass bei Debian das Standardskript nachher aufgerufen wird uns so meine Einstellungen überschreibt. Wie werden die Standardeinstellungen eingespielt, wenn man Debian 3.1r4 frisch installiert?
Standardeinstellungen von was? Mal ins Manual schauen, sonst ist vieles unter /etc gespeichert.
 
Standardeinstellungen von was? Mal ins Manual schauen, sonst ist vieles unter /etc gespeichert.

Nach der Installation von Debian war bei mir iptables standardmässig mit Einträgen versehen. Wo werden diese Standardeinstellungen festgelegt? In meinen Debianbüchern habe ich bis jetzt keinen Hinweis gefunden.
 
Nun habe ich mich wohl falsch ausgedrückt. Ich kannte bereits den Befehl iptables -L. Mit diesem Befehl stelle ich auch fest, welche Regeln nach einem Neustart aktiv sind. Es sind nicht diejenigen, welche im oben beschriebenen Skript definiert hatte. Starte ich mein Skrip manuell, dann stelle ich fest, dass meine Regeln aktiv sind. Aber nach einem Neustart sind alle Regeln weg. Irgendwie werden die mit update-rc.d erzeugt Links nicht ausgeführt oder evtl. später von einem Standardskript wieder überschrieben.
 
Es geht!

Ich kieke, staune, wundre mir!

Nun geht es nun plötzlich. Nach dem heutigen Neustart des Servers war die gewünschte Konfiguration plötzlich vorhanden. Was habe ich gemacht? Ich File unten die Zeile " iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
" eingetragen, weil apt-get nicht funktionierte. Dann habe ich mit "apt-get install moodle" Moodle installiert. Das hat noch zwei, drei kleiner Progrämchen nachgezogen.
Also, ich verstehe einfach nicht, warum es nun plötzlich geht und vorher nach Dutzenden von Neustarten nicht. Habe mich gar nicht um das Problem gekümmert. Vorher waren einfach immer andere Standardeinstellungen drin und ich wusste nicht woher.
Kann mir jemand das erklären?
Einen Verdachte habe ich noch: Weil ich nicht genau wusste wie der iptables-Befehl lautete, habe ich mir die Konfiguration noch in Webmin angeschaut und über Webmin eine Standardinstallation vorgenommen. Könnte es sein, dass gar nicht mein File die Einstellungen vornimmt, sondern die Einstellungen mit Webmin koniguriert wurden? Ich werde es testen, indem ich kurz eine neue Regel ins Skript aufnehme.

Mein Konfigurationsfile:
Code:
#!/bin/sh
#/etc/init.d/firewall-konfig_Bs
#Version 1.0, 02.01.2007, Stefan Büchler, Erstellung
#Vorlage: Jurzik/Debian S. 596
#Konfiguriert die Firewall
#chmod 755 firewall-konfig_Bs
#update-rc.d firewall-konfig_Bs defaults

case "$1" in
  
start|restart|reload)
  echo -n "firewall-konfig_Bs wird gestartet"

  iptables -F
  iptables -P INPUT DROP
  iptables -A INPUT -p tcp --dport http -j ACCEPT
  iptables -A INPUT -p tcp --dport https -j ACCEPT
  iptables -A INPUT -p tcp --dport ssh -j ACCEPT
  iptables -A INPUT -p tcp --dport 10000 -j ACCEPT
  iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
  # Lässt alle eingehenden Verbindungen zu, die Teil einer vorher zugelassenen Session sind
  echo "."
  ;;
 
stop)
  echo "Firewall wird vollständig geöffnet"
  iptables -F
  iptables -P INPUT ACCEPT
  echo "!"
  ;;

*)
  echo "Kommandos: $0 [start|restart|reload|stop]"
  ;;
esac
exit 0
 
Back
Top