php-ből html-kód, gomb, majd shell-script

Sziasztok.
Adott egy kód:


<?php
$output = shell_exec('init 0');
echo "<pre>$output</pre>";
?>

Azt szereetném elérni, hogy ha egy böngészőben bejön egy weboldal, akkor legyen ott egy button, ami indít egy php kódot, amely meghív szerveroldalon egy bash-scriptet.
Az egész nem lenne internetre kötve, semmiféle extrát nem szeretnék, csupán azt, hogy mint a webminben, elindíthassak egy scriptet, pl. a shutdown-t, vagy valami mást.

Tanácstalan vagyok a mikéntben, mert könnyen lehet, hogy html-ben egy javascript is elég lenne egy shell-híváshoz.

Szerintetek mit tegyek?

Hozzászólások

Minden részletezés előtt azt javasolnám, hogy kezdj valamilyen webdev alapozó tankönyvvel, oktató anyaggal, mert több részében a kérdésednek vannak gondok, pl. javascript-ből shell hívás lehetősége, vagy az, hogy a html->php->shell nem külön részként szerepel az elképzelésben. Van egy rakás tananyag, ami ingyen és legális formában elérhető a neten, sok hibája ellenére a w3schools.com indulásnak nem rossz.

Pár ötlet, amivel el tudsz indulni:

- a php kimenetét a böngészőben meg tudod jeleníteni, ez lehet html IS, ebben a html-ben lehet egy link, ami egy másik php fájlra mutat, amiben a fentebb leírt kódod van

- a (html-be ágyazott) javascript shell hívásokat nem tud indítani, nem ez a célja, ezt a fentebb írt módon érdemes tisztázni, php-vel párban lehet használni, egyik erre, másik arra jó (megjegyzés: van php helyett használható js is, de ezt most nem keverném ide, nem erről írtál)

- írtad, hogy ez nem publikus lenne, biztonsági oldaláról ezesetben nincs nagyon szükség beszélni

> a (html-be ágyazott) javascript shell hívásokat nem tud indítani

köszi a részleteket, tulajdonképpen erre voltam főleg kíváncsi, javascriptekkel régebben sem foglalkoztam annyira.

php lesz az alap, az fog include-olni egy html fájlt, csakhogy abban lesz ugye a gomb.
De hogy a button egy form része legyen, vagy valami link...
Nos, megint homélyosan tettem fel a kérdést, mint a topicnyitóban, mert az igazság az, hogy borzalmasan fáradt vagyok.

---
--- A gond akkor van, ha látszólag minden működik. ---
---

link vagy gomb: ha nincs input mezőre szükség, és csak 1 vagy pár paramétered van, akkor link egyszerűbb, nem kell köré egy komplett form

javascript: van szerver oldali javascript is (node.js és hasonlók), az tud shell-t hívni, de te nem erről írtál, és amit akarsz arra jó a php is. a másik megoldás, ha bővíteni akarod, akkor javascript-eket aggathatsz a link nélküli gombokra, azok egy php fájlnak ajax-al post-olgatnak, hogy mit csináljanak, azok meg visszajelzik, hogy sikerült-e. w3schools-on erre is biztos van példa.

bátran, de alaposan érdemes ennek nekimenni, ha saját felhasználásra lesz akkor lehet mindent, de a fentiekben leírtakat ha már fizetős munkáról van szó még 10x jobban át kell gondolni (pl.: linkek nehogy úgy nézzenek ki, hogy vegrehajto.php?command=self-destruct%20initiate, mert ebbe ha egy kicsit is publikus helyre kerül bárki bármit beleír, és a php-d meg végre is hajtja, de nem is folytatom)

csinálsz egy PHP-t ami kiír egy html form-ot, ami önmagának post-ol. (mármint a PHP-nek)
(ha a post tartalma üres, akkor kiiratod a form-ot, ha van -értelmes- tartalma, akkor csinálsz valamit (és kiiratod a form-ot) )

pl:

<?php
if (isset($_POST['action']))
// itt értelmezed a form által küldött adatokat
{
if($_POST['action']=="action1")
{$cmd="echo hello";shell_exec($cmd);}
if($_POST['action']=="action2")
{$cmd="echo world";shell_exec($cmd);}
}

else
// itt generalod a html form-ot

?>

talán érthető, mire gondoltam :-)

Lehet sokmindent, ilyen rövid programoknál egy méretig még nem is gond, de én javaslom inkább szétszedni már most. Csinálj egy html form-ot (generálhatja egy php azt a html-t, ha van benne változó rész), az post-oljon valamilyen php-re, az hajtson végre valamit, és írja ki ha nem sikerült, vagy ha van annak a valaminek kimenete, és legyen rajta egy vissza gomb. Vagy ha egy felületet akarsz, akkor a shell parancs kimenetét berakod session-be (w3schools-on biztos van egy pársoros demo rá), parancs futtatása után visszairányítasz a "főoldalra", a html formra, és ott kiírod a session tartalmát.

Vagy ha GET-et használsz, akkor tudod könyvjelzőzni a különböző parancsokat, így egyetlen kattintással hajthatod végre a kívánt parancsot, ekkor HTML-mel sem kell bohóckodni. Ha a kimenetre is szükséged van, akkor simán kiechozod pre tagek között.
De ettől óvva intelek, ha leállítás, vagy hasonló "végzetes" parancsokat akarsz futtatni, oda nem árt végrehajtás előtt egy jóváhagyás kérése is (legegyszerűbb esetben JS confirm-mal).

Szerintem többek között pont emiatt ne csináld GET-tel. A GET ilyen esetben (más esetben sem) nagyon nem biztonságos, bár azt írtad, hogy csak belső hálózaton lesz, de vajon ott soha nem fordulhat elő, hogy valaki a böngésző előzmény listájából rákattint valamire ami ott van?
A végzetes parancsokról szóló mondanivalóval messzemenően egyetértek - fogadd meg jól.

Sajnos ez sem megy.
Így írtam át:


<?php
if (isset($_POST['action']))
{
    if($_POST['action']=="reboot")
    {$cmd="echo hello> /tmp/hell";shell_exec($cmd);}
    if($_POST['action']=="shutdown")
    {$cmd="echo world> /tmp/hell";shell_exec($cmd);}
}

    else
    include('./index.html')
?> 

ha a /tmp/hell fájl megkeletkezne, lefutna a kicsike. De nem keletkezik meg...

terminálban futtatva a .php fájlt semmi különleges hibaüzenet, csak annyi, hogy a php.ini-ben #-et használtam 2 sorban balga módon. Javítottam, a kimenet ezután tiszta, de a cél még mindig elérhetetlen. Nem mondok le róla, mert ha webminben lehet saját scriptet futtatni, így is lehet valahogy

---
--- A gond akkor van, ha látszólag minden működik. ---
---

Mi lenne ha lepesenkent haladnal?

Elso lepesben megneznem, hogy jol mukodik-e a form egy echo $_POST['action']; kiiratassal, hogy megfelelo erteket kapok-e.
Masodik lepesben valami echo shell_exec('ls -lsa'); kiiratassal kideritenem, hogy mukodik-e a script hivas.
Amennyiben az elso ket lepes sikeres, megprobalnam osszekombinalni oket.

Sic Transit Gloria Mundi

"$cmd="echo world> /tmp/hell";shell_exec($cmd);"

Van valami értelme annak, hogy a fájlba írást shell parancsként valósítod meg?
Miért nem rakod a /tmp/hell fájlba a kívánt szöveget szimplán file_put_contents-szel?

szimplán:
file_put_contents("/tmp/hell", "world");

Ennek a sikerességét is látod, hibaüzenetet is kapsz, ha jogosultságprobléma van.

Ha semmi egyéb interakció nem kell, akkor én úgy csinálnám, hogy egy HTML-fájlt kézzel megszerkesztenék (vagy ha nagyon sok akció kell, akár szkripttel generáltatnám), arra rátenném a kívánt gombokat, mint hivatkozásokat, amelyek egy php-fájlra mutatnak, amelyek a GET függvényében futtatnak le valamit. Röviden:

index.html

<html>
<a href=action.php?action=reboot>Reboot</a>
<a href=action.php?action=shutdown>Shutdown</a>
</html>

action.php

<?
switch ($_GET["action"]) {
  case "reboot": exec("reboot now"); break;
  case "shutdown": exec("shutdown -h now"); break
}
?>

Persze lehet kozmetikázni akár a HTML-t, akár a PHP-t, de az alapötlet úgy gondolom, érthető.

Én ehhez annyit tennék hozzá aranyszabályként, hogy nem illik GET hívásokat használni olyasmire, ami állapotváltozással jár a szerveren.

Ennek több oka van, a részletek itt láthatók: http://stackoverflow.com/a/705789/747704

Célszerűbb linkek helyett űrlapot, és POST hívást használni.

Megcsináltam debianon mindent lépésről lépésre, le is fut minden. Ugyanezt átrámoltam Atch-ra, de ott nem indulnak a scriptek.
Szerintem a problémám Arch-specifikus, vagy a php rosszul van beállítva -- ez utóbbi tényleg kínai számomra, mármint a lehetséges hiba oka.


a@fekete:/var/www/html/php$ 

cat action.html 

<html>
<a href="action.php?action=reboot">Reboot</a>
<a href="action.php?action=shutdown">Shutdown</a>
</html>


a@fekete:/var/www/html/php$ cat action.php 
<?php
switch ($_GET["action"]) {
  case "reboot": exec("./reboot-rpi.sh"); echo('reboot now...'); break;
  case "shutdown": exec("./shutdown-rpi.sh"); echo('shutdown -h now...'); break;
}
?>

a@fekete:/var/www/html/php$ cat reboot-rpi.sh 
#!/bin/bash
echo "reboot now" >/tmp/hopp2

#reboot now
a@fekete:/var/www/html/php$ cat shutdown-rpi.sh 
#!/bin/bash
echo "shutdown -h now" >/tmp/hopp4
# shutdown -h now
a@fekete:/var/www/html/php$ 

(...csak elfelejtettem kirakni a code-tageket. Már ott van.)
---
--- A gond akkor van, ha látszólag minden működik. ---
---

Hello,

Pár napja én is pont ezzel kezdtem el szórakozni, lassan kezd összeállni egy kis oldal, pár backup, mount, shutdown gombbal, illetve kimenetek megjelenítésével.
Jelenleg így néz ki, az apache default oldalát használtam fel.
Természetesen csak itthoni hobbi projekt, a jogosultsági problémák kikerülése nem túl biztonságos éles környezetben :)
www.letix.hu/webiface.PNG

HTML-be az alábbi kell: (a sorok elejére is kell kezdő relációs jel)
form action="script.php">
input type="submit" value="Script">
/form>

script.php-ba:
<?php
shell_exec("script.sh");
header('Location: http://"ipaddress"/index.html?success=true');
?>

script.sh -ba meg amit szeretnél.
Persze a webszervert futtató usernek kell jog, meg ugye +x a script-re is.
Vagy sudoers..

udv
letix

-----------------------------------------
Linux parancsok, kezdőknek

Arch-on futtatok webszervert, ott tudtommal a rootnak mindenféle joga van.
De sajnos a fentiek szerint sem megy a dolog böngészővel, már gondolkodom az egész ötlet kikerülésével, vagy egyszerűen lemondok a funkcióról.

---
--- A gond akkor van, ha látszólag minden működik. ---
---

Fentebb azt írtad, hogy www-data nevében fut a webserver,
ha így van, nem fogja leállítani a script a gépedet jog hiányában.

1: Érdemes lenne a script-ben a hibacsatornát file-ba iránytani valahogy így:
parancs 1> kimenet.txt 2> error.txt

2: Én a te helyedben egy pofonegyszerű Hello World scripttel tesztelném file-ba irányítva. Ha ez megy, akkor lehet folytatni a shutdown-al, amihez szerintem a www-data-t fel kellene NOPASSWD-vel venni a sudoers-be.

Természetesen ilyen felállást csak otthon, izolált körülmények között!

udv
letix
-----------------------------------------
Linux parancsok, kezdőknek

debianon www-data mellett már mindenem megy, mint ahogy fentebb írtam, kilistázva a fájlokat.

A probléma Arch-on van, képtelen vagyok az elmebeteg tájszólásaival megküzdeni. Még a webszerver is máshogy fut? Semmit sem értek. Minden, ami debianon, slackware-en ment, ezen nem működik, hiába küzdök már 2 hete.

Kínomban a html fájlban a link egy csupasz php állományra mutat, ami egy bash-scriptet indít el.


# cat /srv/http/domain1.com/nmea/shutdown.php 
<?php
 exec("/srv/http/domain1.com/nmea/shutdown-rpi.sh")
?>

# cat shutdown-rpi.sh 
#!/bin/bash
systemctl reboot

ha terminálban indítom a php állományt, lefuttatja a bash scriptet. Ugyanezt böngészőn keresztül NEM teszi meg.
Kicseréltem a systemctl... sort egy fájlba írásra a /tmp-be, de böngészőn futtatva az sem megy.

---
--- A gond akkor van, ha látszólag minden működik. ---
---

192.168.12.25 - - [15/Jan/2017:20:24:50 +0100] "GET /nmea/shutdown.php HTTP/1.1" 200 -

ez jelzi, hogy hol a böngésző. Meg hogy a fájl bevirít.

Aztán jön 1-2 érdekesség:
[Thu Jan 01 01:00:16.945344 1970] [http2:warn] [pid 139] AH02951: mod_ssl does not seem to be enabled
[Thu Jan 01 01:00:16.946497 1970] [lbmethod_heartbeat:notice] [pid 139] AH02282: No slotmem from mod_heartmonitor
[Thu Jan 01 01:00:18.341993 1970] [mpm_prefork:notice] [pid 139] AH00163: Apache/2.4.18 (Unix) configured -- resuming normal operations
[Thu Jan 01 01:00:18.342370 1970] [core:notice] [pid 139] AH00094: Command line: '/usr/bin/httpd -D FOREGROUND'
Failed to set wall message, ignoring: The name org.freedesktop.PolicyKit1 was not provided by any .service files
Failed to reboot system via logind: The name org.freedesktop.PolicyKit1 was not provided by any .service files
Failed to start reboot.target: The name org.freedesktop.PolicyKit1 was not provided by any .service files

...szóval a reboot nem futott le.

Kipróbáltam ezt:

#systemctl status polkit.service
* polkit.service
Loaded: not-found (Reason: No such file or directory)
Active: inactive (dead)

Rendben, akkor húzzuk fel a polkitet, legfeljebb upgrade lesz ha már fent van. Erre jött a gyomorbarúgás:

# pacman -S mate-polkit
resolving dependencies...
looking for conflicting packages...

Packages (22) atk-2.18.0-1 compositeproto-0.4.2-3 gdk-pixbuf2-2.32.3-1 gtk-update-icon-cache-3.18.6-1
gtk2-2.24.29-1 hicolor-icon-theme-0.15-1 inputproto-2.3.1-1 jasper-1.900.1-14 js17-17.0.0-3
libcroco-0.6.11-1 libcups-2.1.2-3 librsvg-2:2.40.11-1 libxcomposite-0.4.4-2 libxcursor-1.1.14-2
libxi-1.7.6-1 libxinerama-1.1.3-2 libxrandr-1.5.0-1 nspr-4.11-1 polkit-0.113-4 randrproto-1.5.0-1
xineramaproto-1.2.1-3 mate-polkit-1.12.0-1

Total Download Size: 9.71 MiB
Total Installed Size: 77.93 MiB

:: Proceed with installation? [Y/n] y

Minek a gtk és a többi szotty egy szerverre?!

Na, mára itt dobtam el az agyam a csomagkezelőkkel, függőségekkel együtt, amikor a szimpla polkitet akartam felhúzni:

# pacman -S polkit
resolving dependencies...
looking for conflicting packages...

Packages (3) js17-17.0.0-3 nspr-4.11-1 polkit-0.113-4

Total Download Size: 1.78 MiB
Total Installed Size: 9.13 MiB

:: Proceed with installation? [Y/n] y
:: Retrieving packages ...
error: failed retrieving file 'nspr-4.11-1-armv6h.pkg.tar.xz' from archlinux.surlyjake.com : The requested URL returned error: 404
error: failed retrieving file 'nspr-4.11-1-armv6h.pkg.tar.xz' from mirrors.evowise.com : The requested URL returned error: 404
error: failed retrieving file 'nspr-4.11-1-armv6h.pkg.tar.xz' from mirror.rackspace.com : The requested URL returned error: 404
error: failed retrieving file 'nspr-4.11-1-armv6h.pkg.tar.xz' from mirror.aarnet.edu.au : The requested URL returned error: 404
error: failed retrieving file 'nspr-4.11-1-armv6h.pkg.tar.xz' from archlinux.mirror.digitalpacific.com.au : The requested URL returned error: 404
error: failed retrieving file 'nspr-4.11-1-armv6h.pkg.tar.xz' from ftp.iinet.net.au : The requested URL returned error: 404
error: failed retrieving file 'nspr-4.11-1-armv6h.pkg.tar.xz' from mirror.internode.on.net : The requested URL returned error: 404
^Cerror: failed retrieving file 'nspr-4.11-1-armv6h.pkg.tar.xz' from ftp.swin.edu.au : The requested URL returned error: 404

Interrupt signal received

Webes letöltésnél próbálkozás itt:
http://us.mirror.archlinuxarm.org/armv7h/community/
van kétféle is. Szóval itt leálltam, ez magas.

---
--- A gond akkor van, ha látszólag minden működik. ---
---

Ez is lefut 404-gyel.

Próbálkoztam más mirrorokkal is, teszteltem egy mirrorgeneráló weboldalt is vagy mit, egy élmény volt. Most visszaállítottam a régit. Hiányos, félrevezető vagy félbeszakadt leírások sorozatát olvastam és próbáltam végig.

Ami a csúcs, hogy ha egy teljes upgrade-et végigfuttatok az Arch-omon, akkor gyakorlatilag képtelen vagyok rájönni, miért megy tönkre az egész (gyakorlatilag megszűnik access pointként üzemelni...) Szóval amit eddig ezen elértem, egy csoda.

---
--- A gond akkor van, ha látszólag minden működik. ---
---

Hát, pl. eredetileg armv6h csomagokat keresve kapsz hibát, majd belinkelsz egy armv7h tárolót... Soha életemben nem láttam Arch-ot, de szerintem ez mindenképpen problémát okoz.
Szóval lehet, először el kéne indulni onnan, hogy a választott disztribúcióba (és annak csomagkezelőjébe) beletanulsz, különben minden max. véletlenül fog menni...

A ,,beletanulás'' csak és kizárólag rendesen összerakott disztribúciókból kiidulva lehet. Sajnos ilyet nem nagyon találni. Tettem egy végső kísérletet, elölről kezdtem az egészet, a szűz distrib csomagkezelőjével. Ezt keptam:

# pacman -S polkit
resolving dependencies...
looking for conflicting packages...

Packages (3) js17-17.0.0-3 nspr-4.11-1 polkit-0.113-4

Total Download Size: 1.44 MiB
Total Installed Size: 9.13 MiB

:: Proceed with installation? [Y/n] y
:: Retrieving packages ...
error: failed retrieving file 'nspr-4.11-1-armv6h.pkg.tar.xz' from mirror.archlinuxarm.org : The requested URL returned error: 404
warning: failed to retrieve some files
error: failed retrieving file 'js17-17.0.0-3-armv6h.pkg.tar.xz' from mirror.archlinuxarm.org : The requested URL returned error: 404
warning: failed to retrieve some files
error: failed to commit transaction (unexpected error)
Errors occurred, no packages were upgraded.

ezzel be is fejeztem.

---
--- A gond akkor van, ha látszólag minden működik. ---
---

ez felpakolja ugyan a polkitet, de aztán upgradeli a teljes rendszert, amellyel gyakorlatilag hidegrevágok mindent. Sokszor próbálkoztam ezzel, az eredmény az volt, hogy elölről kellett kezdenem mindent. Minden sikerült egészen a teljes upgrade-ig. Magyarázat nulla.

---
--- A gond akkor van, ha látszólag minden működik. ---
---

ez felpakolja ugyan a polkitet, de aztán upgradeli a teljes rendszert, amellyel gyakorlatilag hidegrevágok mindent.

Arch alatt bizony ez kell - mármint a teljes upgrade. Olyan nincs, hogy csak egy csomagot frissítesz, a többi harmincat meg nem. Így marad a rendszerered (elvileg) "összeszedett". Ha teszem azt, az A csomag függősége a B csomag, és csak az A-t frissíted, akkor egy olyan A-t kapsz, ami az újabb verziójú B-vel lett fordítva - neked pedig egy régebbi B-d van. Sok esetben nem okoz gondot, de amikor igen, akkor jön, hogy "sz@r a rendszer", "elbszták a csomagolók", "nem rendesen összerakott a disztró", stb.

Azt hiszem a tied volt a varázsszó.

Visszaraktam az eredeti mirrorlistemet, próbálkoztam még, majd jött az -Sy.

Eredmény (a promptomat ignoráld):

[Mi kell? root@Takarodj /]# pacman -Syu polkit
:: Synchronizing package databases...
core 174.2 KiB 697K/s 00:00 [######################] 100%
extra 2.3 MiB 488K/s 00:05 [######################] 100%
community 3.6 MiB 254K/s 00:15 [######################] 100%
alarm 37.7 KiB 628K/s 00:00 [######################] 100%
aur 28.5 KiB 1423K/s 00:00 [######################] 100%
:: Starting full system upgrade...
:: Replace fuse with extra/fuse2? [Y/n] n
:: Replace libdbus with core/dbus? [Y/n] ^C
Interrupt signal received

(itt megszakítottam, nem hagytam, hogy lefusson, mert még megint elgúródik)

[Mi kell? root@Takarodj /]# pacman -Sy
:: Synchronizing package databases...
core is up to date
extra is up to date
community is up to date
alarm is up to date
aur is up to date
[Mi kell? root@Takarodj /]# pacman -S polkit
resolving dependencies...
looking for conflicting packages...

Packages (3) js17-17.0.0-4 nspr-4.13.1-1 polkit-0.113-4

Total Download Size: 1.44 MiB
Total Installed Size: 9.15 MiB

:: Proceed with installation? [Y/n] y
:: Retrieving packages ...
nspr-4.13.1-1-armv6h 166.6 KiB 595K/s 00:00 [######################] 100%
js17-17.0.0-4-armv6h 1312.7 KiB 1067K/s 00:01 [######################] 100%
(3/3) checking keys in keyring [######################] 100%
(3/3) checking package integrity [######################] 100%
(3/3) loading package files [######################] 100%
(3/3) checking for file conflicts [######################] 100%
(3/3) checking available disk space [######################] 100%
(1/3) installing nspr [######################] 100%
(2/3) installing js17 [######################] 100%
(3/3) installing polkit [######################] 100%
[Mi kell? root@Takarodj /]#

Szóval kösz. Egyszerű életunt ember vagyok, csodálom, ha valami sikerül a képességeim határán.

----------
A tárgy szóban megfogalmazott problémát azonban ez nem oldotta meg, végig tévúton voltam. Hiába van polkit, a "systemctl reboot"-ot tartalmazó bash-scriptet nem lehet lefuttatni PHP-ből, böngészőn keresztül.

---
--- A gond akkor van, ha látszólag minden működik. ---
---

Mesteri leírások egyike:
http://raspberrypi.stackexchange.com/questions/26357/shutting-down-rasp…

Itt az

"</a>"

zárás előtt nincs string. remek kód, böngészőben meg sem jelenik, ha beteszem a hiányzó stringet, akkor sem megy. Ilyen leírásokból eddig hatot néztem meg és próbáltam ki, mára azt hiszem elegem is lett ebből.

---
--- A gond akkor van, ha látszólag minden működik. ---
---

a hibakeresés, általánosan a diagnosztika első alaptörvénye, hogy EGYSZERRE CSAK EGY VÁLTOZTATÁST tesztelünk. nem komplett ismeretlen teszteletlen kódot. (ahogy fentebb leírták) próbáld ki, ha csinálsz egy php fájlt, amiben csak a shell_exec('echo valami > log.log'); van, majd utána ennek nézd meg a kimenetét a fájlban, vagy ha van telepítve notify-send akkor azzal egyszerűen (notify-send php-magus "ez itt a legmenőbb szál") követni hol tartasz.

ez után csinálj köré változásokat, egyesével, pl. az if-es elágazás többféle action-el, amiket tesztelj szintén, majd ez után a html form az egész elé, ...

ne akard megúszni, mások ismeretlen-teszteletlen-nemműködő kódját stackoverflow-ról bemásolni, mert csak megunod a problémákat, mivel nem is érted mi okozza őket. ha te írod a kódot nagyobb esélyed van megérteni gyorsan, hogy hol a hiba.

hajrá.

Igen, így szoktam pontosan. Csak tudod nem vagyok otthon a könyveim között, a net meg akadozik, szakad, időm is kevés van, mert külföldön mindig az idő a kevés. Aztán még egy kis stressz, és kész a homlokom a falhoz vágáshoz.

Holnap lehet, hogy elölről kezdem. Hogy ebből mi lesz...

jóccakát!

---
--- A gond akkor van, ha látszólag minden működik. ---
---

Én erre a célra CGI-t használnék.
Kicsit több beállítás apache oldalon (imho 2-3 sor a httpd.conf-ban, úgy emlékszem defaultból nincs engedélyezve a CGI. Javítsatok ki ha tévedek.),
meg minimális perl vagy python ismeret.

Nem ellenőriztem csak egy hint:
Nincs valami selinux boolean ami tiltja a php exec-et ?

+1

Perlben legalább három módon lehet rendszerhívást kezdeményezni. Jó-jó, a topik indító PHP-ban akarja megoldani.

Szerk.: Természetesen a www-data jobb, ha nem kap root jogot. Szvsz. a PHP szkripteddel írj bele egy fájlba 1-et, ha reboot parancsot akarsz végrehajtatni, amit rc.localban 0-ra állítasz be. Az cron-nal pedig percenként a root lecsekkolja fájl tartalmát. (Így nem azonnal fut le, de egy percen belül tuti, és nem kell mókolni a www-data jogosultságaival.)

Szia

Egy egyszerű, saját (nem éles!) szerveren használható megoldás:

3 fájlból áll, működési elve hogy a php script kapcsolatot nyit egy magasabb privilégium szintű folyamathoz ami majd futtatja a leállítás parancsot.

server.sh

#!/bin/sh
# A netcat figyel a localhost 1234-es TCP portján és akkor ér véget a futása, amikor megnyitottak vele egy kapcsolatot majd azt lezárták.
netcat -l 127.0.0.1 1234
# Utána jöhet a leállítás
halt

shutdown.php

<?php
$addr = "127.0.0.1";
$port = 1234;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$socket)
{
echo "socket_create() hiba: " . socket_strerror(socket_last_error());
exit(1);
}
if (!socket_connect($socket, $addr, $port))
{
echo "Nem sikerült kapcsolódni a szolgáltatáshoz!";
exit(1);
}
socket_close($socket);
echo ("A rendszer hamarosan leáll.");
?>

index.html

<!doctype html>
<html>
<head>
<title>Szerver vezérlés</title>
</head>
<body>
<a href="shutdown.php">Leállítás</a>
</body>
</html>

Természetesen a server.sh-t futtatni kell a háttérben :)

$ id
uid=0(root) gid=0(root) groups=0(root)
$ chmod +x server.sh
$ ./server.sh&

Persze elegánsabb szolgáltatást készíteni belőle és azt a rendszer indításánál már elindítani.

esetleg valami ilyen:

webrun.php:

<?php
if ($_REQUEST['runcmd']=='1'){system($_POST['command'],$output);echo $output;}
else {echo '< FORM METHOD=POST ACTION=webrun.php?runcmd=1>< INPUT NAME=command TYPE=TEXT>< /INPUT>< INPUT TYPE=SUBMIT VALUE=fuss>< /INPUT>< /FORM>';}
?>

futok.sh:
#!/bin/bash

echo 'lefutottam :)< /B>'

-fs-
Az olyan tárgyakat, amik képesek az mc futtatására, munkaeszköznek nevezzük.
/usr/lib/libasound.so --gágágágá --lilaliba