Forum: PC-Programmierung Mit PHP auf USB-Modem mittels dio unter Unix zugreifen?!


von Till (Gast)


Lesenswert?

Hallo,

ich betreibe seit kurzem eine kleine Unix-Maschine, auf der Debian Lenny 
installiert ist.
Diese Maschine möchte ich als kleinen Webserver für zu Hause verwenden.
Als Webserver läuft lighttpd und kann bereits fehlerfrei PHP-Seiten 
aufrufen.
Außerdem möchte ich mehr "Unix" mit der Maschine lernen...

Nun möchte ich auch auf die USB-Schnittstelle mittels PHP zugreifen.
Angeschlossen ist ein USB-Modem, das in /etc/ttyACM0 zu finden ist.
Mittels dem Tool screen habe ich Zugriff auf dieses Modem, allerdings 
scheitere ich beim Zugriff mit PHP.
Es kommen folgende Warnmeldungen:
Warning: dio_open() [function.dio-open]: cannot open file /dev/ttyACM0 
with flags 2306 and permissions 0: Permission denied in 
/websites/testusb.php on line 3
-
Warning: dio_tcsetattr() expects parameter 1 to be resource, boolean 
given in /websites/testusb.php on line 10
-
Warning: dio_close() expects parameter 1 to be resource, boolean given 
in /websites/testusb.php on line 11

Natürlich ist das dio-Paket auch installiert, vorher wurde der Fehler 
angezeigt, dass dio_open() nicht bekannt ist!

Hier die testusb.php (nicht meckern, ist eh erstmal ein Test):
1
<?php
2
3
$fd = dio_open('/dev/ttyACM0', O_RDWR | O_NOCTTY | O_NONBLOCK);
4
  dio_tcsetattr($fd, array(
5
    'baud' => 9600,
6
    'bits' => 8,
7
    'stop' => 1,
8
    'parity' => 0,
9
    'is_canonical' => 0
10
  ));
11
dio_close($fd);
12
13
?>

Die Rechte der testusb.php habe ich auf 0777 gesetzt, allerdings keine 
Besserung.
Da ich sowieso root bin, denke ich mal, dass ich noch irgendwo etwas 
anpassen muss, nur wo?

Gruß,
Till

von Peter II (Gast)


Lesenswert?

Till schrieb:
> Da ich sowieso root bin, denke ich mal, dass ich noch irgendwo etwas
> anpassen muss, nur wo?

und mit welchen Rechten läuft PHP?

von Till (Gast)


Lesenswert?

Peter II schrieb:
> und mit welchen Rechten läuft PHP?

Ähm, Peter II, wie bekomme ich das denn raus und kann es einstellen?
Sorry, bin noch sehr neu auf dem Gebiet und Windows-geschädigt. ;)

von Oliver R. (sourcebox)


Lesenswert?

Du sagst, dass lighttpd als Webserver läuft. Falls dieser PHP als Modul 
aufruft, so läuft es mit den gleichen Rechten wie der Webserver. Ich 
würde aber eher nicht den Webserver bzw. PHP als root laufen lassen, 
sondern eher die Zugriffsrechte der Schnittstelle ändern.

von Till (Gast)


Lesenswert?

Oliver R. schrieb:
> Ich
> würde aber eher nicht den Webserver bzw. PHP als root laufen lassen,
> sondern eher die Zugriffsrechte der Schnittstelle ändern.

Danke, Oliver R., das klingt plausibel.
Hhm, dann muss ich mich auf die Suche machen, wie man die Rechte der 
Schnittstelle ändert, denn das hat mich bis jetzt noch nie betroffen. ;)
Für einen Tipp wäre ich als Anfänger sehr dankbar!

von Oliver R. (sourcebox)


Lesenswert?

Im Grunde läuft das bei Linux über die udev rules:

http://de.wikipedia.org/wiki/Udev

Normalerweise ist es aber so, dass es bereits Gruppen im System gibt, 
die bestimmte Rechte für Hardware besitzen. Man muss dann nur schauen, 
dass der Webserver-User in diese Gruppe eingetragen ist.

von Till (Gast)


Lesenswert?

Hhm, also angemeldet bin ich momentan als root.

Habe den Ordner /dev mit ls -l ausgegeben und folgendes gefunden:
crw-rw---- 1 root dialout 166,   0 Dec 18 18:31 ttyACM0

dialout wird wohl die Gruppe sein; viele Einträge in /dev sind aber dem 
root zugeordnet.
Was verstehe ich denn unter "Webserver-User"? Wie heißt der denn?
Ist das der "zweite" User, den ich bem Installieren erstellen musste?
Wenn ich die Unix-Maschine neu starte, ich mich nicht mit der Konsole 
darauf einwähle und nur die Adresse http://IP-der-Maschine im Browser 
eingebe, wer ist dann der Webserver-User?
Das verstehe ich noch nicht ganz!

Der Link zum udev ist klasse und geht wohl in die richtige Richtung, 
danke, aber da muss ich mich erstmal reinarbeiten.
Auf dem ersten Blick sieht das ganz schön wild aus!

von Oliver R. (sourcebox)


Lesenswert?

Der lighttpd ist ja ein Prozess, der vom System gestartet wird. Dieser 
läuft unter einer bestimmten User-ID. Du musst da mal in die 
entsprechende Konfigurationsdatei schauen. Meist liegt die unter 
/etc/lighttpd oder ähnlich.

von Lukas K. (carrotindustries)


Lesenswert?

Es dürfen nur root und Benutzer, die mitglied der Gruppe dialout sind 
auf das Modem zugreifen.
Nun läuft aber der lighthttpd als ein Benutzer, der fast nichts darf. 
Wie dieser heißt, ist den Konfigurationsdateien zu entnehmen. Wenn du 
den lighthttpd-Benutzer in die dialout Gruppe aufnimmst, darf auch 
lighthttpd sich auf dem Modem austoben.

von Oliver R. (sourcebox)


Lesenswert?

Schau dir auch mal den Befehl useradd an:

http://linux.die.net/man/8/useradd

Damit solltest du den Webserver-User zur Gruppe dialout hinzufügen 
können.

von Till (Gast)


Lesenswert?

Oliver R. schrieb:
> Der lighttpd ist ja ein Prozess, der vom System gestartet wird. Dieser
> läuft unter einer bestimmten User-ID. Du musst da mal in die
> entsprechende Konfigurationsdatei schauen. Meist liegt die unter
> /etc/lighttpd oder ähnlich.
Lukas K. schrieb:
> Nun läuft aber der lighthttpd als ein Benutzer, der fast nichts darf.
> Wie dieser heißt, ist den Konfigurationsdateien zu entnehmen.

Ich möchte nichts falsch machen. Meint ihr das?
In der Datei /etc/lighttpd/lighttpd.conf steht folgendes:
## change uid to <uid> (default: don't care)
server.username            = "www-data"
## change uid to <uid> (default: don't care)
server.groupname           = "www-data"

Lukas K. schrieb:
> Wenn du
> den lighthttpd-Benutzer in die dialout Gruppe aufnimmst, darf auch
> lighthttpd sich auf dem Modem austoben.
Oliver R. schrieb:
> Schau dir auch mal den Befehl useradd an:
> http://linux.die.net/man/8/useradd
> Damit solltest du den Webserver-User zur Gruppe dialout hinzufügen
> können.
Danke, ich werde es probieren! :)

von Till (Gast)


Lesenswert?

So, ich hab mich jetzt getraut.
Habe mit dem Befehl "adduser www-data dialout" gearbeitet, sollte 
gepasst haben.
Jetzt sind auch die Fehler von der PHP-Seite verschwunden!
Kann man irgendwie prüfen, ob alles geklappt hat, wie es sollte?

von Oliver R. (sourcebox)


Lesenswert?

Genau, du musst www-data zur Gruppe dialout hinzufügen.

Du kannst gerne mal den Befehl "getent group" eingeben, da siehst du als 
letzten Eintrag, welche User zur jeweiligen Gruppe gehören.

von Till (Gast)


Lesenswert?

Ihr seid SPITZE!

Vielen Dank, an der Rechtevergabe hat es gelegen!
Wird dann doch keine schlaflose Nacht! froi

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.