sh script pres binarku s SUID bitem


To <czdebian-l zavinac debian bod cz>
From "Jiří Jánský" <xJanskyJ zavinac seznam bod cz>
Date Thu, 5 Feb 2004 18:23:59 +0100

Dobry den,
uz se to tu trozku rozebiralo a taky to neni vec, ktera by primo 
souvisela s debianem. Tak to prosim omluvte.
Jde o to, ze jsem se dozvedel, ze sh scripty ignoruje SUID bit.
A ja potrebuju cgi-bin script, ktery by restartoval squid server.
Pokusil jsem se tedy napsat kratky program v C, ktery
by pomoci funkce execvl() (nevim, jak je presny nazev,
je to "nadstavba" k funkci exec()) a pridelil mu SUID bit.
No a kdyz pak pod debianem apache zaadal o tento soubor
tak se squid server restartoval, ale apache napsal do prohlizece
chybu konfigurece a v logu spatnou hlavicku. V to dobu me 
to celkem nevzrusovalo, protoze jsem si myslel, ze je tam nejaka
mala chyba a hlavne ze to alespon trochu funguje. Ale horsi to bylo
na serveru z RedHatem, kde maji byt scripty cilove pouzity. Tam to
apache neposlal vubec a pri pokusu o spusteni z prikazove radky
jsem zjistil ze ten program, ackoliv ma nastaveny SUID bit,
nespousti ten shelovy script s privilegiemi roota. Smula.
Po blizsim proskoumenim, jsem si overil, ze SUID bit na binarky
funguje ale na shelovy scripty, ktery jsou spousteny binarkou
s SUID bitem ne. 
  Potrebuji totiz pres (nejlepe pres apache) restartovat squid 
server (treba pomoci teho script v /etc/init.d/squid restart).
Jedno z nabizenych reseni bylo periodicky zpoustet kontrolu
konfiguracniho soubory squidu a pri zmene squid restartovat.
To se mi ale nelibi, protoze je potrebe restartovat maximalne
do jedne minuty a kontrola zmeny souboru dela zatez pocitace
i kdyz se s nim nepracuje.
Pokud by nekoho zajimalo, proc restartovat debiani squid slo
a redhati ne, tak na konci jsem prilozil restartovaci scripty.
Mate nekdo nejaky navrch jek lze toto vyresit?
Za reakce predem dekuji        Jiri Jansky

_________________________________________________
debiani:

#! /bin/sh
#
# squid  Startup script for the SQUID HTTP proxy-cache.
#
# Version: @(#)squid.rc  2.20  01-Oct-2001  miquels zavinac cistron bod nl
#

NAME=squid
DAEMON=/usr/sbin/squid
LIB=/usr/lib/squid
PIDFILE=/var/run/$NAME.pid
SQUID_ARGS="-D -sYC"

[ ! -f /etc/default/squid ] || . /etc/default/squid

PATH=/bin:/usr/bin:/sbin:/usr/sbin

[ -x $DAEMON ] || exit 0

grepconf2 () {
 w="  " # space tab
 sq=/etc/$NAME.conf
 # sed is cool.
 res=`sed -ne '
  s/^'$1'['"$w"']\+[^'"$w"']\+['"$w"']\+\([^'"$w"']\+\).*$/\1/p;
  t end;
  d;
  :end q' < $sq`
 [ -n "$res" ] || res=$2
 echo "$res"
}

#
# Try to increase the # of filedescriptors we can open.
#
maxfds () {
 [ -n "$SQUID_MAXFD" ] || return
 [ -f /proc/sys/fs/file-max ] || return 0
 [ $SQUID_MAXFD -le 4096 ] || SQUID_MAXFD=4096
 global_file_max=`cat /proc/sys/fs/file-max`
 minimal_file_max=$(($SQUID_MAXFD + 4096))
 if [ "$global_file_max" -lt $minimal_file_max ]
 then
  echo $minimal_file_max > /proc/sys/fs/file-max
 fi
 ulimit -n $SQUID_MAXFD
}

start () {
 cdr=`grepconf2 cache_dir /var/spool/$NAME`
 case "$cdr" in
  [0-9]*)
   echo "squid: squid.conf contains 2.2.5 syntax - not starting!" >&2
   exit 1
   ;;
 esac
 maxfds
 umask 027
 cd $cdr
 start-stop-daemon --quiet --start \
  --pidfile $PIDFILE \
  --exec $DAEMON -- $SQUID_ARGS < /dev/null
 sleep 1
}

stop () {
 PID=`cat $PIDFILE 2>/dev/null`
 start-stop-daemon --stop --quiet --pidfile $PIDFILE --exec $DAEMON
 #
 # Now we have to wait until squid has _really_ stopped.
 #
 sleep 2
 if test -n "$PID" && kill -0 $PID 2>/dev/null
 then
  echo -n "Waiting ."
  cnt=0
  while kill -0 $PID 2>/dev/null
  do
   cnt=`expr $cnt + 1`
   if [ $cnt -gt 60 ]
   then
    #
    # Waited 120 seconds now. Fail.
    #
    echo -n " Failed.. "
    break
   fi
   sleep 2
   echo -n "."
  done
  [ "$1" = verbose ] && echo "done."
 else
  [ "$1" = verbose ] && echo "$NAME."
 fi
}

case "$1" in
    start)
 echo -n "Starting proxy server: "
 start
 echo "$NAME."
 ;;
    stop)
 echo -n "Stopping proxy server: "
 stop verbose
 ;;
    reload|force-reload)
 echo -n "Reloading $NAME configuration files: "
 start-stop-daemon --stop --signal 1 \
  --pidfile $PIDFILE --quiet --exec $DAEMON
 echo "done."
 ;;
    restart)
 echo -n "Restarting proxy server: "
 stop
 start
 echo "$NAME."
 ;;
    *)
 echo "Usage: /etc/init.d/$NAME {start|stop|reload|force-reload|restart}"
 exit 1
 ;;
esac

exit 0


________________________________________________________
redhati:

#!/bin/bash
# squid  This shell script takes care of starting and stopping
#  Squid Internet Object Cache
#
# chkconfig: - 90 25
# description: Squid - Internet Object Cache. Internet object caching is \
#  a way to store requested Internet objects (i.e., data available \
#  via the HTTP, FTP, and gopher protocols) on a system closer to the \
# requesting site than to the source. Web browsers can then use the \
# local Squid cache as a proxy HTTP server, reducing access time as \
# well as bandwidth consumption.
# pidfile: /var/run/squid.pid
# config: /etc/squid/squid.conf

PATH=/usr/bin:/sbin:/bin:/usr/sbin
export PATH

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

# check if the squid conf file is present
[ -f /etc/squid/squid.conf ] || exit 0

if [ -f /etc/sysconfig/squid ]; then
  . /etc/sysconfig/squid
else
  SQUID_OPTS="-D"
  SQUID_SHUTDOWN_TIMEOUT=100
fi

# determine the name of the squid binary
[ -f /usr/sbin/squid ] && SQUID=squid
[ -z "$SQUID" ] && exit 0

prog="$SQUID"

# determine which one is the cache_swap directory
CACHE_SWAP=`sed -e 's/#.*//g' /etc/squid/squid.conf | \
 grep cache_dir |  awk '{ print $3 }'`
[ -z "$CACHE_SWAP" ] && CACHE_SWAP=/var/spool/squid

RETVAL=0

start() {
    for adir in $CACHE_SWAP; do
        if [ ! -d $adir/00 ]; then 
      echo -n "init_cache_dir $adir... "
      $SQUID -z -F 2>/dev/null
 fi
    done
    echo -n $"Starting $prog: "
    $SQUID $SQUID_OPTS 2> /dev/null &
    RETVAL=$?
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$SQUID
    [ $RETVAL -eq 0 ] && echo_success
    [ $RETVAL -ne 0 ] && echo_failure
    echo
    return $RETVAL
}

stop() {
    echo -n  $"Stopping $prog: "
    $SQUID -k check >/dev/null 2>&1
    RETVAL=$?
    if [ $RETVAL -eq 0 ] ; then
        $SQUID -k shutdown &
     rm -f /var/lock/subsys/$SQUID
 timeout=0
  while : ; do
  [ -f /var/run/squid.pid ] || break
  if [ $timeout -ge $SQUID_SHUTDOWN_TIMEOUT ]; then
      echo
      return 1
  fi
  sleep 2 && echo -n "." 
  timeout=$((timeout+2))
     done
 echo_success
 echo 
    else
     echo_failure
 echo
    fi
    return $RETVAL
}    

reload() {
    $SQUID $SQUID_OPTS -k reconfigure 
}

restart() {
    stop
    start
}    

condrestart() {
    [ -e /var/lock/subsys/squid ] && restart || :
}

rhstatus() { 
    status $SQUID
    $SQUID -k check
}

probe() {
    return 0
}    

case "$1" in
start)
    start
    ;;

stop)
    stop
    ;;

reload)
    reload
    ;;

restart)
    restart
    ;;

condrestart)
    condrestart
    ;;

status)
    rhstatus
    ;;

probe)
    exit 0
    ;;

*)
    echo $"Usage: $0 {start|stop|status|reload|restart|condrestart}"
    exit 1
esac

exit $?



Partial thread listing: