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

Linux секция за начинаещи => Настройка на програми => Темата е започната от: h7d8 в Jul 02, 2014, 20:49



Титла: Изпълнение на баш скрипт през апаче уеб сървър
Публикувано от: h7d8 в Jul 02, 2014, 20:49
Здравейте.Опитвам се да подкарам баш скрипт,който да спира пппое и после да го пуска.Крайния резултат искам да бъде рестартиране на пппое клиента през уеб страница.

index.html
Код:
<html>
<body>
 <form><input type="button" value="Reset" onClick="window.location.href='inet.php'"></form>
</body>
</html>

inet.php
Код:
<?php
exec('/home/user/public_html/all/html/resetnet.sh');
?>

resetnet.sh
Код:
#!/bin/bash
# reconnect the connection
    poff -a
    pon dsl-provider
    sleep 3

exit 0

До момента при изпълнение през уеб inet.php не изпълнява resetnet.sh.Предполагам,че проблема идва от правата.

root@beast:/home/user/public_html/all# ls -l html/
total 12
-rwxr-xr-x 1 root www-data 123 Jul  2 19:29 index.html
-rw-r--r-- 1 root www-data  63 Jul  2 20:23 inet.php
-rwxr-xr-x 1 root www-data  93 Jul  2 20:33 resetnet.sh
root@beast:/home/user/public_html/all#

Ще се радвам на малко помощ.  [_]3


Титла: Re: Изпълнение на баш скрипт през апаче уеб сървър
Публикувано от: BRADATA в Jul 02, 2014, 21:01
http://stackoverflow.com/questions/16740802/how-to-make-a-system-call-remotely/22953339#22953339


Титла: Re: Изпълнение на баш скрипт през апаче уеб сървър
Публикувано от: Naka в Jul 02, 2014, 23:34
php-то върви с привилегиите на apache.
и понеже имаш
-rwxr-xr-x 1 root www-data  93 Jul  2 20:33 resetnet.sh
r-x за всички други няма проблем с пермишъните на файла.

а на самата директория /home/user/public_html/all/html/ дали имаш правилните пермишъни и може ли apache-то да влезе вътре?


опитай и така
exec("/bin/bash /home/user/public_html/all/html/resetnet.sh");

С exec() 2-ри и трети параметър може да хванеш изхода от командата и exitcode-то.

тука гледам че има има още една функция.
http://www.php.net/manual/en/function.shell-exec.php


Титла: Re: Изпълнение на баш скрипт през апаче уеб сървър
Публикувано от: h7d8 в Jul 03, 2014, 00:36


а на самата директория /home/user/public_html/all/html/ дали имаш правилните пермишъни и може ли apache-то да влезе вътре?


drwxr-xr-x 2 root www-data 4096 Jul  2 20:33 /home/user/public_html/all/html/


Титла: Re: Изпълнение на баш скрипт през апаче уеб сървър
Публикувано от: h7d8 в Jul 03, 2014, 01:07
Пробвах следното:
inet.php
Код:
<?php
$output = shell_exec('/home/user/public_html/all/html/resetnet.sh');
echo "<pre>$output</pre>";
?>

В браузъра ми излиза следното съобщение:
Цитат
/usr/bin/poff: /bin/kill failed.  None stopped.
Error: only members of the 'dip' group can use this command.

ls -la /etc/ppp/peers/dsl-provider
-rw-r----- 1 root dip 141 Jan 23  2013 /etc/ppp/peers/dsl-provider

Въпроса е дали да сменям "dip" на "www-data" или друг вариант?


Титла: Re: Изпълнение на баш скрипт през апаче уеб сървър
Публикувано от: wfw в Jul 03, 2014, 01:11
в /etc/group
намери реда, който започва с dip и добави след последното двуеточие www-data, ако вече имаш, а най-вероятно имаш потребител, го раздели със запетайка. трябва да изглежда така:

dip:x:30:niki,www-data


Титла: Re: Изпълнение на баш скрипт през апаче уеб сървър
Публикувано от: h7d8 в Jul 03, 2014, 01:18
в /etc/group
намери реда, който започва с dip и добави след последното двуеточие www-data, ако вече имаш, а най-вероятно имаш потребител, го раздели със запетайка. трябва да изглежда така:

dip:x:30:niki,www-data

dip:x:30:xplod го промених на dip:x:30:www-data,xplod но пак няма ефект

Цитат
/usr/bin/poff: /bin/kill failed.
Мисля си,че апачето няма права върху /usr/bin/poff и /usr/bin/pon


Титла: Re: Изпълнение на баш скрипт през апаче уеб сървър
Публикувано от: wfw в Jul 03, 2014, 01:26
Цитат
usr/bin/poff: /bin/kill failed.  None stopped.
Error: only members of the 'dip' group can use this command.

грешката е доста добре описана - само потребители на групата dip могат да използват тази команда. потребителя www-data вече е в тази група, значи не би трябвало това да е проблема...

според мен poff е някакъв shell script, който в някакъв момент вика /bin/kill, който вече не е с правата, които трябва. може би трябва да послушаш BRADATA и да подкараш sudo.


Титла: Re: Изпълнение на баш скрипт през апаче уеб сървър
Публикувано от: h7d8 в Jul 03, 2014, 01:31
/usr/bin/pon
Цитат
Код:
#!/bin/sh

while [ $# -ge 1 ]; do
case "$1" in
  --quick|-q)
    QUICK=true
    shift
    ;;
  -*)
    echo "\
Usage: pon [OPTIONS] [provider] [arguments]
  -q|--quick           pppd hangs up after all ip-up scripts are run

If pon is invoked without arguments, /etc/ppp/ppp_on_boot file will be
run, presuming it exists and is executable. Otherwise, a PPP connection
will be started using settings from /etc/ppp/peers/provider.
If you specify one argument, a PPP connection will be started using
settings from the appropriate file in the /etc/ppp/peers/ directory, and
any additional arguments supplied will be passed as extra arguments to
pppd.
"
    exit 0
    ;;
  *)
    break
    ;;
esac
done

if [ ! -r /etc/ppp/peers/ ]; then
  echo "Error: only members of the 'dip' group can use this command."
  exit 1
fi

if [ "$1" ]; then
  PROVIDER=$1
  shift
fi

if [ -z "$PROVIDER" ]; then
  if [ -x /etc/ppp/ppp_on_boot ]; then
    [ "$QUICK" ] && touch /var/run/ppp-quick
    exec /etc/ppp/ppp_on_boot
  fi
  # try the default script
  PROVIDER=provider
fi

if [ ! -e "/etc/ppp/peers/$PROVIDER" ]; then
  echo "\
The file /etc/ppp/peers/$PROVIDER does not exist. Please create it or use
a command line argument to use another file in the /etc/ppp/peers/ directory."
  exit 1
fi

[ "$QUICK" ] && touch /var/run/ppp-quick
exec /usr/sbin/pppd call $PROVIDER "$@"


/usr/bin/poff
Цитат
Код:
#!/bin/sh

# $Id: poff,v 1.8 1999/08/28 16:34:51 phil Exp $
# Written by John Hasler <john@dhh.gt.org> and based on work
# by Phil Hands <phil@hands.com>.  Distributed under the GNU GPL

if [ -x /usr/bin/kill ]; then
  KILL="/usr/bin/kill"
else
  KILL="/bin/kill"
fi
SIG=TERM
DONE="stopped"
MODE=""

usage ()
{
   cat <<!EOF!
usage: $0 [option] [provider]
options:
  -r        Cause pppd to drop the line and redial.
  -d        Toggle the state of pppd's debug option.
  -c        Cause pppd to renegotiate compression.
  -a        Stop all pppd's.  'provider' will be ignored.
  -h        Print this help summary and exit.
  -v        Print version and exit.
  none      Stop pppd.

Options may not be combined.

If 'provider' is omitted pppd will be stopped or signalled if and only if
there is exactly one running unless the '-a' option was given.  If
'provider' is supplied the pppd controlling the connection to that
provider will be stopped or signalled.
!EOF!
}

# Get option.  If there are none replace the "?" that getopts puts in
# FLAG on error with "null".
getopts rdcavh FLAG
if [ "$?" -ne 0 ]; then
    FLAG="null"
fi

# Check for additional options.  Should be none.
getopts :rdcavh DUMMY
if [ "$?" -eq 0 ]; then
    echo "$0: Illegal option -- ${OPTARG}."
    exit 1
fi
case $FLAG in
 "r") SIG=HUP;  DONE=signalled; shift ;;
 "d") SIG=USR1; DONE=signalled; shift ;;
 "c") SIG=USR2; DONE=signalled; shift ;;
 "a") MODE="all"; shift ;;
 "v") echo "$0$Revision: 1.8 $_TrickToPrint_RCS_Revision"; exit 0 ;;
 "h") usage; exit 0 ;;
 "?") exit 1;
esac

# Get the PIDs of all the pppds running.  Could also get these from
# /var/run, but pppd doesn't create .pid files until ppp is up.
PIDS=$(pidof pppd)

# poff is pointless if pppd isn't running.
if [ -z "$PIDS" ]; then
    echo "$0: No pppd is running.  None ${DONE}."
    exit 1
fi

# Find out how many pppd's are running.
N=$(echo "$PIDS" | wc -w)

# If there are no arguments we can't do anything if there is more than one
# pppd running.
if [ "$#" -eq 0 -a "$N" -gt 1 -a $FLAG != "a" ]; then
    echo "$0: More than one pppd running and no "-a" option and
no arguments supplied. Nothing ${DONE}."
    exit 1
fi

# If either there are no arguments or '-a' was specified kill all the
# pppd's.
if [ "$#" -eq 0 -o "$MODE" = "all" ]; then
    $KILL -$SIG $PIDS || {
        echo "$0: $KILL failed.  None ${DONE}."
        exit 1
    }
    exit 0
fi

# There is an argument, so kill the pppd started on that provider.
PEER=$(echo $1 | sed -e 's#/#\\/#g')
PID=$(ps -o pid,cmd axw | awk "/^ *[0-9]* *(\/usr\/sbin\/)?pppd call $PEER( |\$)/ {print \$1}")

if [ "$PID" ]; then
    $KILL -$SIG $PID || {
        echo "$0: $KILL failed.  None ${DONE}."
        exit 1
    }
else
   echo "$0: I could not find a pppd process for provider '$1'. None ${DONE}."
   exit 1
fi

exit 0


Титла: Re: Изпълнение на баш скрипт през апаче уеб сървър
Публикувано от: h7d8 в Jul 03, 2014, 01:42
Нещо елементарно бъркам.Просто искам някакъв баш скрипт през уеб да спре пппое клиента и да го пусне . :o

Цитат
Код:
root@beast:/home/user/public_html/all/html# su www-data
$ poff
kill: Operation not permitted
/usr/bin/poff: /bin/kill failed.  None stopped.
$


Титла: Re: Изпълнение на баш скрипт през апаче уеб сървър
Публикувано от: wfw в Jul 03, 2014, 09:25
Не е точно така, искаш потребител, който няма право, да убие процес на друг потребител, затова ти се дъни.

я покажи командата pppd с какви правa е?


има лесен начин да правиш това през уеб сървъра, но не е много красив. Пишеш в 1 файл със скрипта, като примерно има само 0 или 1 във файла.
Пускаш един крон с root и проверяваш на всяка минута какво има във файла. Ако има 1, пускаш pon и poff и записваш 0. Ако пише 0, само exit. Собственик на файла е уеб сървъра... :)


Титла: Re: Изпълнение на баш скрипт през апаче уеб сървър
Публикувано от: gat3way в Jul 03, 2014, 10:09
Всъщност е по-красив. Много лоша идея е да се изпълняват външни програми от уеб сървъра. Плаче за проблеми. Особено ако им се подава вход под формата на GET или POST параметри. И да не им се дава, пак е проблемно. Отваря широко вратата за DoS атаки.


Титла: Re: Изпълнение на баш скрипт през апаче уеб сървър
Публикувано от: Naka в Jul 03, 2014, 21:58
Цитат
Цитат
/usr/bin/poff: /bin/kill failed.  None stopped.
Error: only members of the 'dip' group can use this command.

Въпроса е дали да сменям "dip" на "www-data" или друг вариант?
това значи че трябва да направиш юзер apache  да е член на групата dip.
------

Цитат
dip:x:30:niki,www-data
защо намесвате www-data  ??? освен ако юзера apache не се казва www-data. поне в  редхатските дистота  httpd върви с името apache.

С какъв юзер ти върви apache-тo?



Титла: Re: Изпълнение на баш скрипт през апаче уеб сървър
Публикувано от: pennywise в Jul 03, 2014, 22:40
На debian-ските user-a е www-data от същата група. Поне при Убунту и Дебиан е така.

Edit: На мен най ми харесва варианта на wfw с cron - прабвай да видиш дали така ще се получи.


Титла: Re: Изпълнение на баш скрипт през апаче уеб сървър
Публикувано от: wfw в Jul 03, 2014, 23:11
Цитат
dip:x:30:niki,www-data
защо намесвате www-data  ??? освен ако юзера apache не се казва www-data. поне в  редхатските дистота  httpd върви с името apache.

С какъв юзер ти върви apache-тo?

Виж в първия пост още, файловете са с група www-data, така че е доста вероятно да съм познал...

едит: основен проблем в случая е, че командата kill не работи, а не, че самите скриптове не работят, затова му предложих още един вариант за измъкване от ситуацията, освен този на БРАДАТА.


Титла: Re: Изпълнение на баш скрипт през апаче уеб сървър
Публикувано от: h7d8 в Jul 04, 2014, 01:36
Не е точно така, искаш потребител, който няма право, да убие процес на друг потребител, затова ти се дъни.

я покажи командата pppd с какви правa е?


има лесен начин да правиш това през уеб сървъра, но не е много красив. Пишеш в 1 файл със скрипта, като примерно има само 0 или 1 във файла.
Пускаш един крон с root и проверяваш на всяка минута какво има във файла. Ако има 1, пускаш pon и poff и записваш 0. Ако пише 0, само exit. Собственик на файла е уеб сървъра... :)

Ще пробвам този вариант,ако имаш написан скрипт тестван може да подхвърлиш нещо.Ако нямаш аз ще го напиша само да имам време и ще го постна.Този вариант е по-добър.Май я карам парлапанската ( дали заради времето или пак заради времето ),само да не ми излезе през ноздрите. :) Благодаря!  [_]3


Титла: Re: Изпълнение на баш скрипт през апаче уеб сървър
Публикувано от: wfw в Jul 04, 2014, 09:02
най-лесния начин да запишеш 1 във файла, когато  искаш да ресетнеш според мен е:
Код:
#!/bin/bash
echo 1 > /path/to/file

после за крон-а, нещо от рода на:

Код:
#!/bin/bash
value = `cat /path/to/file`
if [ $value == 1]
then
/etc/init.d/poff
/etc/init.d/pon
echo 0 > /path/to/file
fi

не съм го тествал дали работи, но трябва да е нещо близко до това


Титла: Re: Изпълнение на баш скрипт през апаче уеб сървър
Публикувано от: edmon в Jul 04, 2014, 13:18
SuExec
CGI
Са все неща които може да провериш, защо съществуват и кой келеш ги е измислил!:)


Титла: Re: Изпълнение на баш скрипт през апаче уеб сървър
Публикувано от: gat3way в Jul 04, 2014, 14:22
Цитат
cat 1 > /path/to/file

Освен ако нямаш файл кръстен "1" със съдържание "1", това няма да сработи.


Титла: Re: Изпълнение на баш скрипт през апаче уеб сървър
Публикувано от: wfw в Jul 04, 2014, 20:57
моя грешка.
echo 1 > /path/to/file


Титла: Re: Изпълнение на баш скрипт през апаче уеб сървър
Публикувано от: h7d8 в Jul 15, 2014, 21:02
Снощи ми остана малко време да прегледам до къде бях стигнал и какво в крайна сметка ще се получи от всичко до момента по темата.Днес също заделих малко време,защото смятам че е редно да публикувам крайния резултат и за в бъдеще да сработи идеята и при друг.

index.html
Код:
<html>
<body>
 <form><input type="button" value="Reset" onClick="window.location.href='inet.php'"></form>
</body>
</html>

inet.php
Код:
<?php
exec('/home/user/public_html/all/inet/resetnet.sh');
?>

resetnet.sh
Код:
#!/bin/bash
echo 1 > /home/user/public_html/all/inet/data

Файловете index.html inet.php resetnet.sh се намират в директория,която се индексира от апачето и юзър различен от root.

Под root се изпълняват следните файлове: inet.sh resetnet.sh (resetnet.sh е с различно съдържание от предходния!За удобство може да му бъде променено името,но и да бъде отразено в останалите файлове.)

inet.sh
Код:
#!/bin/bash
data="/home/user/public_html/all/inet/data"
c="cat"
script="/root/resetnet.sh"
if [ `$c $data` == "1" ] ; then $script
fi
echo 0 > $data

resetnet.sh
Код:
#!/bin/bash
# reconnect the connection
time=$(date +"%d-%m-%Y @ %H:%M:%S")
    poff -a
    pon dsl-provider
    sleep 3
echo $time >> /root/inet.log
exit 0

root@beast:~#
crontab -l
* * * * * /root/inet.sh >/dev/null 2>&1
root@beast:~#

Скрипта се изпълнява всяка минута и проверява във файл data дали е 1 или 0,ако е 1 скрипта сваля pppoe връзката после я вдига и логва във файл inet.log
Файла data съм го направил с права на апаче юзър и групата ( chown -R www-data:www-data data - така апачето може да записва 1 или 0 в този файл..при мен е www-data т.е дебиан )

root@beast:~# ls -la /home/user/public_html/all/inet/data
-rwxr-xr-x 1 www-data www-data 2 Jul 15 20:38 /home/user/public_html/all/inet/data
root@beast:~#

Ако използвате този метод - дистанционно и ръчно да сваляте и вдигате пппое връзката  е важно да ограничите достъпа до index.html до определен адрес,адреси или цяла подмрежа.Защо ми беше нужно това?Днс-ите на доставчика ми се шашкат (може и рутера при мен) и от време на време трябва да се убие пппое връзката,а после да се вдигне,а когато не сте наблизо или нямате време идва на помощ довереник,който без роот достъп да свърши тази задача.Към момента не коментирам възможността с реализация на скрипт,който да пингва даден адрес и ако има проблем с връзката да направи същото.Очаквам мнения и решения за нещо по читаво като изпълнение. :) Благодаря на съфорумците,които се включиха и ми спестиха време и нерви.Идеята не е моя и затова по [_]3 на автора и.

(http://s8.postimg.org/hodc4srk5/linuxbg_reset_pppoe_client.jpg)