Автор Тема: Изпълнение на баш скрипт през апаче уеб сървър  (Прочетена 1774 пъти)

h7d8

  • Напреднали
  • *****
  • Публикации: 197
  • Distribution: Debian;Ubuntu
  • Window Manager: Gnome
    • Профил
Здравейте.Опитвам се да подкарам баш скрипт,който да спира пппое и после да го пуска.Крайния резултат искам да бъде рестартиране на пппое клиента през уеб страница.

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
Активен

BRADATA

  • Напреднали
  • *****
  • Публикации: 833
  • Distribution: Slackware/Mint/CentOS
  • Window Manager: console/KDE/LXDE
    • Профил
    • WWW
Активен

Naka

  • Напреднали
  • *****
  • Публикации: 2670
    • Профил
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
« Последна редакция: Jul 02, 2014, 23:39 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

h7d8

  • Напреднали
  • *****
  • Публикации: 197
  • Distribution: Debian;Ubuntu
  • Window Manager: Gnome
    • Профил


а на самата директория /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/
« Последна редакция: Jul 03, 2014, 00:52 от h7d8 »
Активен

h7d8

  • Напреднали
  • *****
  • Публикации: 197
  • Distribution: Debian;Ubuntu
  • Window Manager: Gnome
    • Профил
Пробвах следното:
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" или друг вариант?
Активен

wfw

  • Напреднали
  • *****
  • Публикации: 247
  • Distribution: Debian
  • Window Manager: none
    • Профил
в /etc/group
намери реда, който започва с dip и добави след последното двуеточие www-data, ако вече имаш, а най-вероятно имаш потребител, го раздели със запетайка. трябва да изглежда така:

dip:x:30:niki,www-data
Активен

h7d8

  • Напреднали
  • *****
  • Публикации: 197
  • Distribution: Debian;Ubuntu
  • Window Manager: Gnome
    • Профил
в /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
« Последна редакция: Jul 03, 2014, 01:21 от h7d8 »
Активен

wfw

  • Напреднали
  • *****
  • Публикации: 247
  • Distribution: Debian
  • Window Manager: none
    • Профил
Цитат
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.
Активен

h7d8

  • Напреднали
  • *****
  • Публикации: 197
  • Distribution: Debian;Ubuntu
  • Window Manager: Gnome
    • Профил
/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
Активен

h7d8

  • Напреднали
  • *****
  • Публикации: 197
  • Distribution: Debian;Ubuntu
  • Window Manager: Gnome
    • Профил
Нещо елементарно бъркам.Просто искам някакъв баш скрипт през уеб да спре пппое клиента и да го пусне . :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.
$
Активен

wfw

  • Напреднали
  • *****
  • Публикации: 247
  • Distribution: Debian
  • Window Manager: none
    • Профил
Не е точно така, искаш потребител, който няма право, да убие процес на друг потребител, затова ти се дъни.

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


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

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Всъщност е по-красив. Много лоша идея е да се изпълняват външни програми от уеб сървъра. Плаче за проблеми. Особено ако им се подава вход под формата на GET или POST параметри. И да не им се дава, пак е проблемно. Отваря широко вратата за DoS атаки.
Активен

"Knowledge is power" - France is Bacon

Naka

  • Напреднали
  • *****
  • Публикации: 2670
    • Профил
Цитат
Цитат
/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?

« Последна редакция: Jul 03, 2014, 22:12 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

pennywise

  • Гост
На debian-ските user-a е www-data от същата група. Поне при Убунту и Дебиан е така.

Edit: На мен най ми харесва варианта на wfw с cron - прабвай да видиш дали така ще се получи.
« Последна редакция: Jul 03, 2014, 23:19 от pennywise »
Активен

wfw

  • Напреднали
  • *****
  • Публикации: 247
  • Distribution: Debian
  • Window Manager: none
    • Профил
Цитат
dip:x:30:niki,www-data
защо намесвате www-data  ??? освен ако юзера apache не се казва www-data. поне в  редхатските дистота  httpd върви с името apache.

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

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

едит: основен проблем в случая е, че командата kill не работи, а не, че самите скриптове не работят, затова му предложих още един вариант за измъкване от ситуацията, освен този на БРАДАТА.
« Последна редакция: Jul 03, 2014, 23:17 от wfw »
Активен