Autor Téma: Problém s pravý  (Přečteno 765 krát)

Offline Le_Ze

  • Začátečník
  • **
  • Příspěvků: 25
    • Zobrazit profil
Problém s pravý
« kdy: 07. 01. 2018, 08:12:08 »
Zdravím Vás.
Proč toto jede jen přes sudo?
Kód: [Vybrat]
<?php
exec
("stty -F /dev/ttyAMA0 9600 -parenb cs8 -cstopb ");
$fp fopen('/dev/ttyAMA0','r+');
fwrite($fp"hups");
fclose($fp);
?>

JInak.
Citace
stty: /dev/ttyAMA0: Operace zamítnuta
PHP Warning:  fopen(/dev/ttyAMA0): failed to open stream: Permission denied in /var/www/ser1.php on line 3
PHP Warning:  fwrite() expects parameter 1 to be resource, boolean given in /var/www/ser1.php on line 4
PHP Warning:  fclose() expects parameter 1 to be resource, boolean given in /var/www/ser1.php on line 5

Je to na raspi.
pi i  www-data jsou ve skupině tty
A  toto přes web i terminal jede bez sudo.
system ('echo hups> /dev/ttyAMA0');





Offline Petr Gajdůšek

  • Začátečník
  • **
  • Příspěvků: 60
    • Zobrazit profil

Offline Le_Ze

  • Začátečník
  • **
  • Příspěvků: 25
    • Zobrazit profil
Re:Problém s pravý
« Odpověď #2 kdy: 10. 01. 2018, 09:00:39 »
To asi ne, když to přes terminal funguje
echo hups> /dev/ttyAMA0

I přes PHP

Kód: [Vybrat]
<?php
system 
('echo hups> /dev/ttyAMA0');
?>

Tak jinak.
sudo stty -F /dev/ttyAMA0 9600
Bez sudo to vyhodí Permission denied.
Přes sudo ok.
Jak zjistím, ve ktere skupině musí být pi, aby mohl přistupovat k stty bez sudo?


Offline Petr Gajdůšek

  • Začátečník
  • **
  • Příspěvků: 60
    • Zobrazit profil
Re:Problém s pravý
« Odpověď #3 kdy: 11. 01. 2018, 19:45:37 »
Ahoj,

Ty se v tom PHP pokoušíš otevřít /dev/ttyAMA0 pro zápis a čtení
Kód: (php) [Vybrat]
fopen('/dev/ttyAMA0','r+'); Ale protože je používáno jako sériová console (terminál), je na něm spuštěno getty, a tedy k němu má přístup jen skupina tty, a to jen pro zápis.

Kód: (bash) [Vybrat]
$ ls -l /dev/ttyAMA0
crw--w---- 1 root tty 204, 64 Jun  1 21:10 /dev/ttyAMA0

Proto ti pod Apachem funguje např.
Kód: (php) [Vybrat]
system ('echo hups> /dev/ttyAMA0'); když je Apache (uživatel www-data) ve skupině tty.

Podívej se do /proc/cmdline a uvidíš tam něco jako console=ttyAMA0,115200. Systemd potom na tomhle portu pustí getty a to nastaví zařízení  /dev/ttyAMA0  práva jako consoli (terminálu). Do terminálu smí zapisovat jen skupina tty, ale nesmí z něho číst. Zápis je nutný např. pokud chceš poslat zprávu na všechny terminály, můžeš použít /usr/bin/wall, který je vlastněn skupinou tty a má nastaven SETGID bit.

Ten odkaz ti měl napovědět. Jen tam místo řešení příčiny - /dev/ttyAMA0 se používá jako sériová console - ji obchází tím, že zakážou systemd unitu serial-getty@.service, která na zařízení /dev/ttyAMA0  spustí getty.

man 8 systemd-getty-generator

Odstraň z /boot/cmdline.txt text console=ttyAMA0,115200 a rebootuj.

Nyní už nebude /dev/ttyAMA0 používán jako console (nepoběží na něm getty), ale bude dostupný jako seriový port, ke kterému budou mít přístup uživatelé ve skupině dialout, pro čtení i zápis.

Kód: (bash) [Vybrat]
$ ls -l /dev/ttyAMA0
crw-rw---- 1 root dialout 204, 64 Jun  2 11:29 /dev/ttyAMA0

Dej apache (uživatele www-data) do skupiny dialout; odstraň ho ze skupiny tty a restartuj.

Viz. https://wiki.debian.org/SystemGroups
« Poslední změna: 11. 01. 2018, 20:18:38 od Petr Gajdůšek »

Offline Le_Ze

  • Začátečník
  • **
  • Příspěvků: 25
    • Zobrazit profil
Re:Problém s pravý
« Odpověď #4 kdy: 11. 01. 2018, 20:16:28 »