Strona 1 z 2

[+] Uruchamianie skryptu bash przez PHP

: 18 października 2011, 21:24
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.

: 19 października 2011, 13:05
autor: Bastian
Spróbuj wywoływac tak

Kod: Zaznacz cały

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

albo wyłącz selinux

: 19 października 2011, 13:37
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.

: 19 października 2011, 18:46
autor: Bastian
Plik sudoers edytujesz przez visudo?

: 19 października 2011, 18:57
autor: buker999
Tak, przez visudo.

: 19 października 2011, 20:07
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.

: 20 października 2011, 19:53
autor: buker999
Dużo mi to nie mówi. Mam napisać kolejny skrypt, który uruchomi skrypt?

: 20 października 2011, 21:41
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.

: 20 października 2011, 22:45
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ł.

: 20 października 2011, 22:51
autor: fnmirk

Kod: Zaznacz cały

man su
man su-to-root