2012-07-24 28 views
12

Tengo un script de shell que necesita una cuenta de usuario no root para ejecutar ciertos comandos y luego cambiar el usuario a la raíz para ejecutar el resto del script. Estoy usando SUSE11. He utilizado esperar para automatizar la solicitud de contraseña. Pero cuando uso spawn su - y se ejecuta el comando, el mensaje vuelve con la raíz y el resto del script no se ejecuta.Cambiar al usuario root dentro de la secuencia de comandos del shell

Por ejemplo.

< non-root commands> 
spawn su - 
<root commands> 

Pero después de su: el mensaje regresa con el usuario como root. Cómo ejecutar el resto del script.

La opción sudo -S no ayuda ya que no ejecuta sudo -S comando ifconfig que necesito para encontrar la dirección IP de la máquina.

ya he pasado por estos enlaces, pero no pude encontrar una solución: Change script directory to user's homedir in a shell script

Changing unix user in a shell script

Gracias de antemano

Respuesta

15

sudo va a trabajar aquí, pero es necesario que cambiar la escritura un poco :

$ cat 1.sh 
id 
sudo -s <<EOF 
echo Now i am root 
id 
echo "yes!" 
EOF 

$ bash 1.sh 
uid=1000(igor) gid=1000(igor) groups=1000(igor),29(audio),44(video),124(fuse) 
Now i am root 
uid=0(root) gid=0(root) groups=0(root) 
yes! 

Necesita ejecutar su c ommand en el bloque <<EOF y dé el bloque al sudo.

Si lo desea, puede usar su, por supuesto. Pero necesita ejecutarlo usando expect/pexpect que le ingresará la contraseña.

Pero incluso el caso de que podría manejar para introducir la contraseña de forma automática (o apagarlo) esta construcción no funcionaría:

user-command 
su 
root-command 

En este caso root-command se ejecutará con el usuario, no con privilegios de root, porque se ejecutará después de que su haya finalizado (su abre un nuevo shell, no cambia el uid del shell actual). Se puede utilizar el mismo truco aquí, por supuesto:

su -c 'sh -s' <<EOF 
# list of root commands 
EOF 

Pero ahora usted tiene lo mismo que con sudo.

1

La forma más fácil de hacerlo sería crear al menos dos scripts.

El primero debe llamar al segundo con privilegios de administrador. Por lo tanto, cada comando que ejecute en el segundo script se ejecutará como root.

Por ejemplo:

runasroot.sh

sudo su-c'./scriptname.sh' 

scriptname.sh

apt-get install mysql-server-5.5 

o lo que necesite.

+0

¿Qué pasa si, en lugar de root, le llamamos $ USERNAME2? Gracias de antemano. – raja777m

8

Hay una manera fácil de hacerlo sin una segunda secuencia de comandos. Simplemente ponga esto al comienzo de su archivo:

if [ "$(whoami)" != "root" ] 
then 
    sudo su -s "$0" 
    exit 
fi 

Luego se ejecutará automáticamente como root. Por supuesto, esto supone que puede sudo su sin tener que proporcionar una contraseña, pero eso está fuera del alcance de esta respuesta; vea una de las otras preguntas sobre el uso de sudo en scripts de shell para saber cómo hacerlo.

+0

Ten cuidado; '" $ 0 "' [puede no ser lo que crees que es] (http://mywiki.wooledge.org/BashFAQ/028). – ELLIOTTCABLE

+1

@ELLIOTTCABLE Eso es interesante, pero estoy asumiendo que $ 0 es el comando para iniciar el proceso actual, no la ruta al archivo actual, por lo que es un poco menos frágil. Aún así, un buen punto, y un enlace muy útil. – Benubird

+0

para la solicitud de contraseña simplemente use 'echo $ PASSWORD | sudo -S su -c "$ 0" ' – Leathan

Cuestiones relacionadas