[+] Uruchamianie skryptu bash przez PHP

Potrzebujesz pomocy z C, C++, perl, python, itp.
buker999
Posty: 89
Rejestracja: 18 października 2011, 21:22
Lokalizacja: Warszawa

[+] Uruchamianie skryptu bash przez PHP

Post autor: buker999 »

Witam.
Mam problem z uruchomieniem skryptu bash przez php. Zawartość pliku sudo zdaje mi się, że jest istotna:

Kod: Zaznacz cały


Defaults    env_reset
Defaults:www-data !requiretty
# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL) ALL
www-data    ALL=NOPASSWD: /home/ts3/test1.sh


# Allow members of group sudo to execute any command after they have
# provided their password
# (Note that later entries override this, so you might need to move
# it further down)
%sudo ALL=(ALL) ALL
#
#includedir /etc/sudoers.d
Skrypt bash:

Kod: Zaznacz cały

#!/bin/bash
mkdir /home/ts3/folder
Skrypt php:

Kod: Zaznacz cały

<?PHP
$control = Array();

exec('sudo sh /home/ts3/test1.sh 2>&1', $control);
echo 'skrypt zostal wykonany';
  var_dump($control);
?> 
  
To co wyświetla skrypt php:

Kod: Zaznacz cały

skrypt zostal wykonanyarray(1) { [0]=> string(53) "sudo: no tty present and no askpass program specified" } 
I teraz ważne pytanie, w czym jest problem? Skrypt bash działa gdy go uruchamiam z jakiegokolwiek konta użytkownika, więc w nim nie ma problemu. Z tego co jest w logach wynika, że sudo nie może się zapytać o hasło. Więc jak zrobić aby nie pytał się o hasło.
Awatar użytkownika
Bastian
Member
Posty: 1424
Rejestracja: 30 marca 2008, 16:09
Lokalizacja: Poznañ

Post autor: Bastian »

Spróbuj wywoływac tak

Kod: Zaznacz cały

sudo -tt sh /home/ts3/test1.sh 2>&1

albo wyłącz selinux
buker999
Posty: 89
Rejestracja: 18 października 2011, 21:22
Lokalizacja: Warszawa

Post autor: buker999 »

Kod: Zaznacz cały

<?PHP
$control = Array();

exec('sudo -tt sh /home/ts3/test1.sh 2>&1', $control);
echo 'skrypt zostal wykonany';
  var_dump($control);
?> 
Wyświetla mi coś takiego:

Kod: Zaznacz cały

skrypt zostal wykonanyarray(8) {   [0]=>   string(34) "usage: sudo -h | -K | -k | -L | -V"   [1]=>   string(34) "usage: sudo -v [-AknS] [-p prompt]"   [2]=>   string(75) "usage: sudo -l[l] [-AknS] [-g groupname|#gid] [-p prompt] [-U username] [-u"   [3]=>   string(56) "            username|#uid] [-g groupname|#gid] [command]"   [4]=>   string(67) "usage: sudo [-AbEHknPS] [-C fd] [-g groupname|#gid] [-p prompt] [-u"   [5]=>   string(78) "            username|#uid] [-g groupname|#gid] [VAR=value] [-i|-s] []"   [6]=>   string(66) "usage: sudo -e [-AknS] [-C fd] [-g groupname|#gid] [-p prompt] [-u"   [7]=>   string(35) "            username|#uid] file ..." }
Nie mogę wyłączyć Selinux bo nie chce stracić na bezpieczeństwie.
Awatar użytkownika
Bastian
Member
Posty: 1424
Rejestracja: 30 marca 2008, 16:09
Lokalizacja: Poznañ

Post autor: Bastian »

Plik sudoers edytujesz przez visudo?
buker999
Posty: 89
Rejestracja: 18 października 2011, 21:22
Lokalizacja: Warszawa

Post autor: buker999 »

Tak, przez visudo.
Awatar użytkownika
Bastian
Member
Posty: 1424
Rejestracja: 30 marca 2008, 16:09
Lokalizacja: Poznañ

Post autor: Bastian »

Cytat z podręcznika php funkcji exec():
There are (perhaps insurmountable) difficulties when trying to execute sudo commands from a PHP script and from an external script called by PHP on SELinux enabled machines.

SELinux won't let apache change the group id of the process by default.

You may need to use another solution, like make the PHP script deposit a file in a directory which is monitored by cron or inotify and which will call another script with root privileges.
buker999
Posty: 89
Rejestracja: 18 października 2011, 21:22
Lokalizacja: Warszawa

Post autor: buker999 »

Dużo mi to nie mówi. Mam napisać kolejny skrypt, który uruchomi skrypt?
Awatar użytkownika
Bastian
Member
Posty: 1424
Rejestracja: 30 marca 2008, 16:09
Lokalizacja: Poznañ

Post autor: Bastian »

Jeżeli chcesz wykonywać coś przez sudo, to musisz napisać skrypt, który będzie tworzył skrypt basha, a cron okresowo będzie go wykonywał jako root. Możesz też dać uprawnienia do tego skryptu serwerowi apache bezpośrednio i wywoływać bez sudo.
buker999
Posty: 89
Rejestracja: 18 października 2011, 21:22
Lokalizacja: Warszawa

Post autor: buker999 »

No tak, tylko że będę potrzebował wykonywać skrypty, które wymagają uprawnień roota np. adduser/deluser itp., itd. Więc sudo i tak będę musiał używać. SUID/GUID, zrobić właścicielem roota i wykonywać jako właściciel? Nie wychodziło mi to ale może ktoś dzięki temu wpadnie na pomysł.
fnmirk
Senior Member
Posty: 8324
Rejestracja: 03 grudnia 2007, 06:37

Post autor: fnmirk »

Kod: Zaznacz cały

man su
man su-to-root
ODPOWIEDZ