Linux за българи: Форуми

Linux секция за напреднали => Хардуерни и софтуерни проблеми => Темата е започната от: ivanatora в Apr 25, 2004, 14:18



Титла: sudoers
Публикувано от: ivanatora в Apr 25, 2004, 14:18
Целта на занятието е да се направи един скрипт за рестартиране на DHCP клиента (това изисква root), който да се пуска през уеб сървър (php). В rd.php имам:
Примерен код
<?php
exec(rd.sh)
?>

В rd.sh имам:
Примерен код
sudo dhcpcd -k
sleep 5s
sudo dhcpcd

От тук нататък трябва да напиша нещо в /etc/sudoers.. Апашът се пуска с user nobody, така че ръгнах:
Цитат
nobody  localhost=dhcpcd -k, dhcpcd

Направих го с pico, въпреки че във файла пише да се редактира само с visudo.. с vi не мога да работя.
Гледам после PID на процеса (dhcpcd) и пускам http://path/to/rd.php и после пак гледам PID-a. Не се е променил, сиреч DHCP клиента не се е рестартирал? Когато пускам скрипта ръчно (като root без sudo частите) PID на процеса се променя.


Титла: sudoers
Публикувано от: dmvic в Apr 25, 2004, 22:29
така е защото sudo иска парола за администратор, по-добре да разрешиш на nobody да използва dhcpcd, не знам дали ако просто промениш правата на dhcpcd ще се получи.


Титла: sudoers
Публикувано от: savel в Apr 26, 2004, 02:38
пробвай с

nobody  localhost= NOPASSWD: dhcpcd -k, dhcpcd


Титла: sudoers
Публикувано от: ivanatora в Apr 26, 2004, 09:52
Ето какво става като пробвам да пусна dhcpcd като nobody (правата на файла са 755):
$ /sbin/dhcpcd -k
****  /sbin/dhcpcd: not a superuser
Ето какво става като пробвам да пусна rd.sh от конзола като nobody:
Примерен код

$ ./rd.sh
>>> sudoers file: syntax error, line 26 <<<
sudo: parse error in /etc/sudoers near line 26
./rd.sh: line 1: 30676 Broken pipe             sudo dhcpcd -k
>>> sudoers file: syntax error, line 26 <<<
sudo: parse error in /etc/sudoers near line 26

Ето и въпросния файл /etc/sudoers около линия 26:
Цитат


# Samples
# %users  ALL=/sbin/mount /cdrom,/sbin/umount /cdrom <= линия 26
nobody  localhost = NOPASSWD: dhcpcd -k, dhcpcd



Други идеи?


Титла: sudoers
Публикувано от: в Apr 26, 2004, 10:24
chmod +x /sbin/dhcpd
samo che taka vseki user shte move da go puska i spira i ne e mnogo secure.


Титла: sudoers
Публикувано от: ivanatora в Apr 26, 2004, 10:30
Ами аз това ти казвам, че по подразбиране dhcpcd си е rwxr-xr-x, сиреч това +х си го има. Но не може да се стартира като non-root, защото дава:
****  /sbin/dhcpcd: not a superuser


Титла: sudoers
Публикувано от: dafo в Apr 26, 2004, 17:10
Цитат (ivanatora @ Април 26 2004,09:52)
Цитат

nobody  localhost = NOPASSWD: dhcpcd -k, dhcpcd

Напиши пълния път до dhpcd както и името на машината (hostname команда)
nobody  име_на_машината(пешо,гого,киро)=NOPASSWD: /пълен_път/dhcpcd -k, /пълен_път/dhcpcd


Титла: sudoers
Публикувано от: ivanatora в Apr 26, 2004, 17:31
Примерен код
$ ./rd.sh

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these two things:

        #1) Respect the privacy of others.
        #2) Think before you type.

Password:

Moje li da stane bez password prompt? Ako towa e edinstwenia nachin kak da podam parolata prez scripta?


Титла: sudoers
Публикувано от: dafo в Apr 26, 2004, 18:07
Това се появява като стартирам sudo за пръв път, после пита само за парола.
Пробвай в секцията Defaults:nobody !authenticate  ,така би трябвало да не пита за парола,освен ако не си задал PASSWD при изпълнение на команда.


Титла: sudoers
Публикувано от: ivanatora в Apr 26, 2004, 22:36
Дафо, благодаря ти, стана номера на китайчето :)
Само че открих, че целия ми подход е грешен и за нищо не става ;)
По-точно под конзола с nobody пускам файла и DHCPто се рестартира успешно. Но опитвам да го направя през уеб-а (http://path/to/rd.php) и нищо не става - процеса си върви.. грешка в PHP кода ли имам?


Титла: sudoers
Публикувано от: ivanatora в Apr 26, 2004, 23:20
Дафо, благодаря ти, стана номера на китайчето :)
Само че открих, че целия ми подход е грешен и за нищо не става ;)
По-точно под конзола с nobody пускам файла и DHCPто се рестартира успешно. Но опитвам да го направя през уеб-а (http://path/to/rd.php) и нищо не става - процеса си върви.. грешка в PHP кода ли имам?


Титла: sudoers
Публикувано от: ivanatora в Apr 26, 2004, 23:26
Проблема е решен :)
Ако някой го интересува ето го решението:
- два файла, в отделна директория с owner nobody (казват че просто трябва да има write access до скриптовете, за това просто смених притежателя)
rd.php:
Примерен код

<?php
exec('bash -c "exec nohup setsid ./rd.sh > /dev/null 2>&1 &"');
?>

rd.sh:
Примерен код

sudo /sbin/dhcpcd -k
sleep 5s
sudo /sbin/dhcpcd

rd.sh също така е 755 oт към права.
Коментарите за sudo са нагоре из цялата тема.. няма да се задълбавам тук :)
Какво не правех както трябва.. синтаксиса на функцията exec() ми беше грешен, а пък и попаднах на следния интересен коментар за нея в php.net :
Цитат

In order to execute a command have have it not hang your php script while it runs, the program you run must not output back to php. To do this, redirect both stdout and stderr to /dev/null, then background it.
 
 > /dev/null 2>&1 &
 
 In order to execute a command and have it spawned off as another process that is not dependent on the apache thread to keep running (will not die if somebody cancels the page) run this:
 
 exec('bash -c "exec nohup setsid your_command > /dev/null 2>&1 &"';);

Дано цялата тая работа свърши работа на някого :)


Титла: sudoers
Публикувано от: Venski в May 31, 2004, 04:16
хмм. видях тази тема и се сетих за нещо, което много ми е трябвало на няколко пъти. от време на време ми умира sshd-то на една машина, до която нямам пряк достъп. реших да пробвам по начина описан по-горе, за да не се налага да будя в 01:50 човека в чиито апартамент се намира машината.

огледах какво сте писали, и наистина след настройките в sudoers user-а nobody може да изпълнява това което ми трябва
Примерен код
nobody router=NOPASSWD: /etc/rc.d/rc.sshd restart

нраправих и въпросния script, който трябва да се извиква от .php файла, който е просто
Примерен код
sudo /etc/rc.d/rc.sshd restart

и конзолно всичко върви като по вода, само че когато се опитам да го стартирам чрез .php-то нищо не се случва. .php файла изглежда точно като примера даден от ivanatora, който той казва че работи (копиран е от там).

само че ... не върви. можете ли да дадете някакви предположения?


Титла: sudoers
Публикувано от: ivanatora в May 31, 2004, 10:28
Цитат (Venski @ Май 31 2004,04:16)
нраправих и въпросния script, който трябва да се извиква от .php файла, който е просто
Примерен код
sudo /etc/rc.d/rc.sshd restart

При мен файла не е само това. Разгледай по-добре примера с цитата от php.net. Погледни си и правата на директорията също така. За да се изпълни скрипта трябва потребителят с който се пуска апача да има +w достъп.


Титла: sudoers
Публикувано от: Venski в May 31, 2004, 11:07
добре де. явно съм се изразил неправилно. файловете са:

rd.sh
Примерен код

sudo /etc/rc.d/rc.sshd restart

това е файла, който .php-то exec-ва.

ssh_restart.php
Примерен код

<?php
exec('bash -c "exec nohup setsid ./rd.sh > /dev/null 2>&1 &"');
?>

а това е самото .php

не виждам кой знае какви разлики, освен че ти искаш script-а да ти изпълни 2 команди, а при мене е само 1.

btw не разбирам за какво му е на user nobody да има +w в директорията в която е script-а (нали за нея казваш)? и трябва ли да има +w по целия път до там или само в нея?

сложих му +w на директорията, в която е script-а, но пак не се получи. (т.е. директорията съм я сложил като owned от група nobody и моят user. правата на директорията сега са 775. мисля че това му стига, или не?)


Титла: sudoers
Публикувано от: kostadinz в May 31, 2004, 12:15
не е ли по-елегантно cron-a да рестартира каквото трябва, при условие че съществува някакво файлче някъде.
откъм web-а създаваш файлчето, крона го намира, трие го и рестартира процеса.


Титла: sudoers
Публикувано от: Venski в May 31, 2004, 13:11
не виждам cron-а с какво ще помогне, при положение че това което се случва е че процеса на sshd си седи, но дефакто не работи както трябва.

дори и да се направи script, който да проверява дали има процес sshd, той не може да разбере дали sshd работи като хората, или не.

може да се стартира през определено време script-а, който прави /etc/rc.d/rc.sshd restart, но това означава че през 30-60 минути sshd ще се рестартира, независимо дали има нужда от това. някакси ми се струва ненужно.

но все пак е вариант ...


Титла: sudoers
Публикувано от: ivanatora в Jun 01, 2004, 09:23
Не виждам къде може да е проблема... Казваш че правата на директорията са 755, а как са на шел скрипта и на *.пхп-то?


Титла: sudoers
Публикувано от: Venski в Jun 01, 2004, 17:55
Примерен код

-rwxr-xr-x    1 venski   users          31 May 31 10:57 rd.sh
-rw-r--r--    1 venski   users          73 May 31 11:04 ssh_restart.php