exec() naar /dev

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Daan Onbekend

Daan Onbekend

25/11/2010 14:47:47
Quote Anchor link
Hallo,

Ik wil graag een hexadecimale waarde naar een rs232 poort sturen onder linux.

Als ik in een terminal dit intyp: echo -e '\xFF' > /dev/ttyUSB0
Dan werkt dit gewoon.

Als ik echter dit doe;

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo exec("echo -e '\xFF' > /dev/ttyUSB0");
?>


Dan werkt het niet meer (geeft een lege pagina).

Kan iemand mij vertellen hoe ik ervoor zorg dat php ook toegang to /dev heeft.
Ik heb /dev al gechmod naar 777, maar dat maakt niets uit.



Bvd
Gewijzigd op 25/11/2010 14:48:20 door Daan Onbekend
 
PHP hulp

PHP hulp

21/11/2024 18:21:32
 
- SanThe -

- SanThe -

25/11/2010 14:57:23
Quote Anchor link
Wat zou er moeten gebeuren als je die hexFF naar die port stuurt?
Gebruik bij echo ook eens het hele path. Waarschijnlijk /bin/echo.

Toevoeging op 25/11/2010 15:00:19:

Daan Middendorp op 25/11/2010 14:47:47:
Ik heb /dev al gechmod naar 777, maar dat maakt niets uit.


Staat de c er nog wel vóór? crw-rw-rw-
 
Chris -

Chris -

25/11/2010 15:03:07
Quote Anchor link
Quote:
"Dan werkt dit gewoon."

Wat krijg je als output in console? En de lege pagina, weet je zeker dat hij de opdracht niet uitvoert?

Let er ook op dat je waarschijnlijk als een andere gebruiker het commando uitvoert (apache, www-user oid)
 

25/11/2010 15:07:02
Quote Anchor link
Natuurlijk kan je ook nog testen door eerst gewoon echo te doen, zonder naar /dev te schrijven.
 
Pim -

Pim -

25/11/2010 15:16:16
Quote Anchor link
exec()
The last line from the result of the command. If you need to execute a command and have all the data from the command passed directly back without any interference, use the passthru() function.
 
John D

John D

25/11/2010 15:50:00
Quote Anchor link
vraagje: je hebt een USB seriele rs232 poort op je machine ?
de normale seriele devices zijn ttyS0 t/mttyS3
Je kan de werking van de echo onder php ook eerst testen naar file:
echo -e '\xFF' > test.log
test.log komt dan in de $HOME (meestal /home/apache) van apache terecht waar apache mag schrijven. Dan weet je in ieder geval dat het werkt vanuit php.
 
Daan Onbekend

Daan Onbekend

25/11/2010 19:37:22
Quote Anchor link
@SanThe
Dan moet er een dimmer aangestuurd worden die mijn verlichting aanzet (hier wil ik een webinterface omheen bouwen)
Het hele pad naar echo gebruiken maakt ook niet uit (als ik echo exec('echo test'); doe, dan werkt dat ook gewoon)
En de c staat er nog gewoon voor.

@Chris
Als ik het commando in een terminal uitvoer, dan krijg ik geen enkele output, maar mijn verlichting gaat wel aan.

@Karl
Ja, dat werkt gewoon.

@John
Het is inderdaad een usb->rs232.
echo -e '\xFF' > test.log lijkt niet te werken.
Ik heb géén /home/apache of iets dergelijks, en ik kan dit bestand ook niet vinden.
Als ik er echo -e '\xFF' > /home/daan/test.log van maak, dan werkt het trouwens ook niet.
Gewijzigd op 25/11/2010 19:38:14 door Daan Onbekend
 
Aad B

Aad B

25/11/2010 20:39:06
Quote Anchor link
@Daan "echo -e '\xFF' > /home/daan/test.log" kan niet werken omdat apache (de owner van de webdeamon/webserver) mag niet schrijven in /home/daan.
- check of apache inderdaad owner is van de webserver/webservice door in de console/terminal te doen: ps -ef |grep http
Dat moet iets van deze output opleveren:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
ps -ef |grep http
root      2430     1  0 07:41 ?        00:00:00 /usr/sbin/httpd
root      2453  2430  0 07:41 ?        00:00:00 /usr/sbin/rotatelogs /var/log/ht
tpd/mysql_log 86400 +60
apache    2484  2430  0 07:41 ?        00:00:00 /usr/sbin/httpd
apache    2485  2430  0 07:41 ?        00:00:00 /usr/sbin/httpd
apache    2486  2430  0 07:41 ?        00:00:00 /usr/sbin/httpd
apache    2487  2430  0 07:41 ?        00:00:00 /usr/sbin/httpd
apache    2488  2430  0 07:41 ?        00:00:00 /usr/sbin/httpd
apache    2489  2430  0 07:41 ?        00:00:00 /usr/sbin/httpd
apache    2490  2430  0 07:41 ?        00:00:00 /usr/sbin/httpd
apache    2491  2430  0 07:41 ?        00:00:00 /usr/sbin/httpd
root      6964  6935  0 20:34 pts/0    00:00:00 grep http

apache is dus eigenaar en zal het bestand test.log proberen te schrijven.
voer dat in php uit zonder pad specs: echo -e '\xFF' > test.log
Zoek vervolgens het bestand met:
find / -name test.log -print
Als het bestand niet gevonden wordt dan is er misschien een php error.
Die kan je vinden in /var/log/httpd/error_log !
Je kan in een andere console/terminal een tail -f doen op dit bestand:
tail - f /var/log/httpd/error_log
en alle php fouten komen netjes voorbij!
 
Daan Onbekend

Daan Onbekend

25/11/2010 21:24:25
Quote Anchor link
@Aad
Het bestand test.log is in het hele bestandssyteem niet te vinden.

Deze foutopsporingsmethode kende ik niet, de foutmeldingen die ik hierin tegengekomen ben zijn:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
sh: cannot create test.log: Permission denied



Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
_mcleanup: gmon.out: Permission denied
error opening /dev/ttyUSB0


Het is dus een rechtenprobleem.
 
Aad B

Aad B

25/11/2010 21:33:08
Quote Anchor link
in principe moet apache wel in zijn home directory een test.log kunnen schrijven. Het lukt mij ook niet, ik krijg ook een sh: test.log: Permission denied
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo exec("echo -e '\xFF' > /tmp/test.log");
?>

Bovenstaand werkt wel dus het is inderdaad een kwestie van rechten uitzoeken.
In /tmp mag "iedereen" schrijven.
Gewijzigd op 25/11/2010 21:34:21 door Aad B
 
Daan Onbekend

Daan Onbekend

25/11/2010 21:36:52
Quote Anchor link
Chmodden en chownen werk niet.

Hier is iemand met een soortgelijk probleem (alleen fopen ipv exec), en die geeft aan dat het met suphp wel werkt.
https://answers.launchpad.net/ubuntu/+source/php4/+question/5169

Ik ga maar eens in suphp verdiepen...
 
Aad B

Aad B

25/11/2010 21:56:54
Quote Anchor link
De oplossing is simpel, het php script probeert de exec uit te voeren in je DocumentRoot. Ik heb een directory aangemaakt: mkdir test en vervolgens chmod 777 test en het script aangepast:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo shell_exec("echo -e '\xFF' > test/test.log");
?>

en het werkt, dus issue is autorisatie en dat geld ook voor je seriele poort.
Gewijzigd op 25/11/2010 22:06:56 door Aad B
 
Daan Onbekend

Daan Onbekend

25/11/2010 22:21:58
Quote Anchor link
Helaas, hierdoor ontstaat er een ander probleem.

Na het chmodden van /dev/ttyUSB0 kan ik er niets meer naartoe sturen.
In de terminal blijf hij hangen, en ik krijg geen error.
In php blijft de pagina laden. (Ik bedenk mij nu, dat dit erop duid dat hij geen permissieproblemen heeft, anders hing hij niet.)

Nou heeft dit denk ik met deze bug te maken:
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/661321

Deze bug heeft al eerder wat roet in het eten gegooid.

Ik heb een "rs232 gender changer" gekocht, zodat ik niet meer afhankelijk ben van die USB kabel, maar ik de rs232 poort op mijn singleboardcomputer kan gebruiken.
Hier wacht ik dus op, zodra ik die binnen heb ga ik verder...

In ieder geval bedankt voor jullie hulp.
Gewijzigd op 25/11/2010 22:23:47 door Daan Onbekend
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.