python skript mit shebang starten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
B0ysc0ut
User
Beiträge: 5
Registriert: Freitag 14. November 2008, 15:44

hallo leute.

bin letztens auf nen kleinen python websniffer gestoßen den ich selber bissl erweitern will.

hier mal schnell der code:

Code: Alles auswählen

#!/usr/bin/python

"""WEBSNIFFER"""

import httplib
import string
import os


opera = { "User-Agent":"Opera/9.20 (Windows NT 6.0; U; en)",
          "Accept-Charset":"ISO-8859-1, UTF-8; q=0.7, *; q=0.7",
          "Cache-Control":"no",
          "Accept-Language":"de, en; q=0.7, en-us; q=0.3",
          "Referer":"http://www.google.de" }




domain = 'www.harlekin-bowling.de'
path = '/'
method = 'GET'
params = None
profile = opera


conn = httplib.HTTPConnection (domain)
conn.request (method, path, params, profile)
stat = conn.getresponse()
headers = stat.getheaders()
version = stat.version
status = stat.status
reason = stat.reason
data = stat.read()
conn.close()


file_name = domain.replace (".", "-")
file_object = open (file_name, "w")
file_object.write (data)
file_object.close()


print "\n"
print "WEBSNIFFER 0.1"
print 20 * "-"
print "\n"

print "Header (Client)"
print 20 * "-"
for key, value in profile.iteritems():
        print "%s \t %s" % (key, value)
print 20 * "-"
print "\n"

print "Header (Server)"
print 20 * "-"
print "HTTP \t %s" % (version)
print "Status \t %s (%s)" % (status, reason)
for key, value in headers:
        print "%s \t %s" % (key, value)
print 20 * "-"
print "\n"

print "Quelltext - geschrieben in file:"
print file_name
print 20 * "-"
print "\n"
nun zu meinem problem: ich rufe das skript auf der konsole mit "./websniffer.py" auf. durch den shebang sollte es funktioniern. leider werden mir fehlermeldungen ausgegeben:
: No such file or directory1: #!/usr/bin/python
: command not foundy: line 2:
: command not foundy: line 3: programmbeschreibung
: command not foundy: line 4:
./websnifferStart.py: line 5: import: command not found
./websnifferStart.py: line 6: import: command not found
./websnifferStart.py: line 7: import: command not found
: command not foundy: line 8:

denke daran kann man deutlich sehen dass das prog nicht interpretiert wird durch den python interpreter. rufe ich das skript mit "python websniffer.py" auf funktioniert es wunderbar! auch jemand anders hat das bei sich getestet u es hat wunderbar geklappt.

/usr/bin/python zeigt bei mir auf /usr/bin/python2.5.

könnt ihr mir bitte helfen? warum funktioniert der shebang nicht?
ach ja...bei:

Code: Alles auswählen

#!/usr/bin/python

print "Hello World!"
funktioniert der shebang auch.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Warum das Shebang beim ersten Code nicht funktioniert und beim zweiten doch, erschließt sich mir nicht.

Grundsätzlich solltest du dir aber angewöhnen, an Stelle von

Code: Alles auswählen

#! /usr/bin/python
die Zeile

Code: Alles auswählen

#! /usr/bin/env python
zu verwenden, so dass der Python-Interpreter ggf. auch gefunden wird, falls er nicht in /usr/bin liegt.
BlackJack

Ich würde mal darauf tippen, dass die Datei Windowszeilenenden statt Linuxzeilenenden enthält.
farid
User
Beiträge: 95
Registriert: Mittwoch 8. Oktober 2008, 15:37

numerix hat geschrieben:Grundsätzlich solltest du dir aber angewöhnen, an Stelle von

Code: Alles auswählen

#! /usr/bin/python
die Zeile

Code: Alles auswählen

#! /usr/bin/env python
zu verwenden, so dass der Python-Interpreter ggf. auch gefunden wird, falls er nicht in /usr/bin liegt.
Kann ich nur unterstuetzen! Es gibt neben den BSDs auch andere unixoide-systeme, die nicht das Layout von Linux befolgen, und Python z.B. unter /usr/local/bin, /vol/bin usw. abstellen. Ausserdem kann man so zur Laufzeit (mit PATH) eine eigene Python-Version aussuchen.
B0ysc0ut
User
Beiträge: 5
Registriert: Freitag 14. November 2008, 15:44

hallo zusammen,

danke für eure antworten!

also mit "/usr/bin/env python" hast du recht. das muss ich mir angewöhnen.

beide varianten funktionieren nicht. u ich verstehe selbst nicht warum der shebang bei einem anderen prog funktioniert. erschließt sich mir auch nicht.

das mit den windowszeilenende hatte ich mir au scho überlegt....weil ich es tatsächlich unter windoof zsgeschrieben habe. hab es dann nomml komplett abgeschrieben bei mir daheim (debian lenny). leider das gleiche verhalten!
BlackJack

Hast Du Dir die Datei mal in einem Hexeditor angesehen? Oder mal die erste Zeile mit Python und der `repr()`-Funktion? Ich tippe wirklich ganz stark auf Windowszeilenenden oder irgendwelche anderen unsichtbaren Steuerzeichen.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Oder probier mal sed -e "s/\r\n/\n/g" -i dateiname

Wenns dann nicht funktioniert, schau dir die Datei mittels xxd an. "a0" ist der "\n" in hex.

EDIT: Tschuldigung, "0A" ist der \n, nicht a0.
B0ysc0ut
User
Beiträge: 5
Registriert: Freitag 14. November 2008, 15:44

hallo,

ich glaube ihr habt recht gehabt. habe die datei aus der python-shell heraus mal eingelesen u mir die erste zeile ausgeben lassen. hier das ergebniss:

Code: Alles auswählen

'\xef\xbb\xbf#!usr/bin/python\r\n'
ich versteh zwar die ersten 3hexzahlen ned aber ich denke das "\r\n" ist gleichbedeutend mit CR LF oder? das ist also tatsächlich das windows-dateiende.

mit was muss ich denn die datei öffnen um das zu bearbeiten?
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Ich bin leider schon lange nicht mehr mit ner bash in Berührung gekommen, aber ich meine das ich in Fedora Core ;) ein Tool namens dos2unix an board hatte. Das konnte sowas beheben.
B0ysc0ut
User
Beiträge: 5
Registriert: Freitag 14. November 2008, 15:44

habe tofrodos gefunden...mit "fromdos program.py" hat es dann die zeilenenden geändert. hab ich danach überprüft.
leider zeigt das skript immer noch das gleiche verhalten wie davor....

was bedeuten denn die 3hex-zahlen die vor dem shebang stehen?
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Datenmüll. Entfernen mit einem Hex Editor. Die Datei war nicht zufällig vorher in irgendeinem tollen Format gespeichert, wie zb RTF? Schau dir mal den Rest der Datei an.
lunar

farid hat geschrieben:Kann ich nur unterstuetzen! Es gibt neben den BSDs auch andere unixoide-systeme, die nicht das Layout von Linux befolgen, und Python z.B. unter /usr/local/bin, /vol/bin usw. abstellen.
Der FHS gilt größtenteils auch für Unix, und Free-, Net- und OpenBSD nutzen alle /usr/bin. Kein vernünftiges Unix legt python als /vol/bin/python ab.
Ausserdem kann man so zur Laufzeit (mit PATH) eine eigene Python-Version aussuchen.
Niemand nutzt "/usr/bin/env perl" oder "/usr/bin/env bash" aus diesen Gründen, warum also muss man das bei Python tun?
B0ysc0ut
User
Beiträge: 5
Registriert: Freitag 14. November 2008, 15:44

hallo zusammen,

also hab mir das mitm hex-editor nomml angeguckt u die ersten 3 zeichen entfernt....u hab danach beim ausführen gemerkt woran es gescheitert ist....ich hab in der IDLE UTF-8 eingesteltt....aber mein restliches system ist nicht auf unicode umgestellt....


danke an alle die geholfen haben!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

str1442 hat geschrieben:Datenmüll. Entfernen mit einem Hex Editor. Die Datei war nicht zufällig vorher in irgendeinem tollen Format gespeichert, wie zb RTF? Schau dir mal den Rest der Datei an.
Nein, EF BB BF ist das UTF-8 Byte Order Mark, das einige Windows-Editoren (überflüssigerweise) in Dateien reinschreiben und mit denen viele Unix-Tools und Kernel nicht umgehen können. Man kann es problemlos entfernen.

lunar, Python ist auf den Solaris-Kisten in der Rechnerhalle unter ``/usr/sfw/bin/python`` zu finden (und das ist noch bei weitem nicht der dümmste Pfad wo man Applikationen findet, es gibt noch reihenweise Sachen die nichtmal in PATH eingetragen sind). Perl ist in ``/usr/bin/perl`` und Bash in ``/bin/bash``.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Immer so Dinge, mit denen man nicht rechnet :? :)
lunar

Leonidas hat geschrieben:lunar, Python ist auf den Solaris-Kisten in der Rechnerhalle unter ``/usr/sfw/bin/python`` zu finden (und das ist noch bei weitem nicht der dümmste Pfad wo man Applikationen findet, es gibt noch reihenweise Sachen die nichtmal in PATH eingetragen sind).
Ich bezweifele, dass "/usr/sfw/bin/python" der Standardpfad unter Solaris ist. Außerdem sind diese Systeme nicht gerade ein Beispiel für gute Administration ;)
Leonidas hat geschrieben:Bash in ``/bin/bash``.

Code: Alles auswählen

[lunar@eddie on pts/0] - [17. November 2008, 23:45:21] >> ~/test
--> ssh xxx@rayhalle1.informatik.tu-muenchen.de which bash
Password:
/usr/bin/bash
Und das ist bei Unix-Derivaten sogar eher Regel denn Ausnahme, da die Bash bei Unix-Systemen eigentlich eher unüblich ist und daher meistens nicht als Systemshell installiert wird, sondern als ganz gewöhnliche Software unter /usr/bin oder /usr/local/bin.
farid
User
Beiträge: 95
Registriert: Mittwoch 8. Oktober 2008, 15:37

lunar hat geschrieben:Der FHS gilt größtenteils auch für Unix, und Free-, Net- und OpenBSD nutzen alle /usr/bin. Kein vernünftiges Unix legt python als /vol/bin/python ab.
Nein, unter BSD wird thrid-party software unter /usr/local/bin abgelegt. Der Python-Port tut naemlich genau das, genauso wie alle anderen Ports. Unter /usr/bin befindet sich nur das Userland von BSD selbst, und dazu zaehlen nicht die Interpreter (auch nicht Python).

"#!/usr/bin/env python" IST die kanonische She-bang Zeile, und das aus gutem Grund. :D
lunar

farid hat geschrieben:Nein, unter BSD wird thrid-party software unter /usr/local/bin abgelegt. Der Python-Port tut naemlich genau das, genauso wie alle anderen Ports. Unter /usr/bin befindet sich nur das Userland von BSD selbst, und dazu zaehlen nicht die Interpreter (auch nicht Python).
Das wusste ich nicht. Mich würde dann allerdings mal interessieren, wo dann "bash" und "perl" liegen ...
Antworten