¿Cómo ejecuto un script bash que requiere privilegios de root?

15

Tengo estas líneas de script de mi ISP:

sudo bash
echo "plugin L2TP.ppp">>/etc/ppp/options 
echo "l2tpnoipsec">>/etc/ppp/options

Funciona si pego línea por línea en la Terminal. Quiero crear un archivo * .command y ejecutarlo haciendo doble clic. Pero todo lo que obtengo es la solicitud de contraseña y luego la ventana bash vacía. El archivo de "opciones" resultante está vacío.

Intenté esto:

#!/bin/bash

echo "plugin L2TP.ppp">>/etc/ppp/options 
echo "l2tpnoipsec">>/etc/ppp/options

Yo obtengo:

/ etc / ppp / options: permiso denegado

Creo que necesito usar algún comando para obtener privilegios de root desde adentro de bash.

Dmitriy
fuente
Cuando creó su script, ¿lo ejecutó escribiendo sudo ./ispscript.command? Además, los scripts bash generalmente tienen un sufijo .sh: ipscript.sh.
Aaron Lake
1
FYI Este script solo debería ejecutarse una vez. Además, si sigue ejecutando el script tal cual, está APENDIENDO >> al archivo. El archivo de opciones continuará creciendo en tamaño cuanto más lo ejecute (el script). Esto puede o no causar problemas con lo que está leyendo el archivo de opciones.
dhempler
@ dennis.hempler, gracias, lo sé. En realidad, ejecutaré este script a menudo. Debido a que el dispositivo de módem USB necesita que este archivo esté en blanco para funcionar correctamente. Entonces, antes de insertar el módem USB, borro el archivo y antes de conectarme a Internet por cable, escribo esas opciones en el archivo.
Dmitriy

Respuestas:

15

Tome el guión que creó:

#!/bin/bash

echo "plugin L2TP.ppp">>/etc/ppp/options 
echo "l2tpnoipsec">>/etc/ppp/options

Guárdelo en su directorio de inicio, o en un directorio 'scripts' dentro de su directorio de inicio, como l2tp.sh. Permita que se ejecute (escriba este comando en la Terminal):

chmod 700 ~/path/to/l2tp.sh

Para ejecutar el archivo usando sudo (privilegios de root):

Método 1. En tipo de terminal:

$ sudo ~/path/to/l2tp.sh

Método 2. Cree un archivo run_l2tp.command con este contenido:

sudo ~/path/to/l2tp.sh

Permitir que se ejecute:

chmod u+x run_l2tp.command

Cuando hace doble clic en run_l2tp.command e ingresa la contraseña, el archivo l2tp.sh se ejecutará con privilegios de root.

Algunas notas:

  • En sistemas similares a UNIX, ~ es la abreviatura de "mi directorio personal".
  • Chmod 700 hará que el archivo sea ejecutable solo por usted. Para más información: ver esta página de Wikipedia .
  • escribiendo 'sudo' antes de que un comando ejecute el programa usando privilegios de root. Tenga cuidado al hacer esto, pueden pasar cosas malas si no está seguro de lo que está haciendo.
  • Obviamente, puede omitir / path / to si guardó este script directamente en su directorio de inicio.
Aaron Lake
fuente
4

Guarda esto:

#!/bin/bash

echo "plugin L2TP.ppp">>/etc/ppp/options 
echo "l2tpnoipsec">>/etc/ppp/options

a su escritorio en un archivo llamado script.sh.

Abra una ventana de Terminal y escriba:

sudo bash ~/Desktop/script.sh

Ingrese su contraseña cuando se le solicite y todos los comandos en el archivo se ejecutarán con privilegios de superusuario.

Ian C.
fuente
4

Si por razones de seguridad, no desea que ningún usuario de su sistema pueda ejecutar el script, sino que desea que se le solicite una contraseña administrativa, una solución alternativa sería guardar el script de shell y luego usar el programa Editor de AppleScript para crear un AppleScript.

El AppleScript sería una frase, diciendo do shell script «your script's name here» with administrator privileges. Guarde ese script como una aplicación. Luego, cuando haga clic en él, le pedirá una contraseña de administrador, luego ejecutará el script de shell con privilegios de administrador.

Obviamente, reemplace «your script's name here»con la ruta a su script.

Daniel
fuente
2

El problema es que cuando lo haces desde la línea de comandos, lo que estás haciendo es comenzar desde bashabajo sudoy luego enviar esos dos comandos siguientes bash, no el shell original. (la señal es que necesitas hacerlo exitdos veces)

Cuando lo hace en un script, el bashcomando nunca sale, por lo que los siguientes dos comandos nunca se ejecutan.

No es tan elegante como la solución AppleScript, pero si va a hacer esto como un script desde la línea de comandos, el equivalente sería:

#!/bin/sh --
sudo bash -c 'echo "plugin L2TP.ppp">>/etc/ppp/options' 
sudo bash -c 'echo "l2tpnoipsec">>/etc/ppp/options'

Si no necesitáramos el redireccionamiento io (el >>bit), podríamos llamar directamente al comando sudosin necesidad del sudo sh -ctruco. (y tenga en cuenta que tuve que citar el argumento para sh -cevitar que ejecute el eco como raíz, pero el archivo se agrega como el usuario original).

Se va a trabajar como un .commandarchivo desde el Finder, sino que va a abrir una ventana de terminal, solicitando su contraseña, y si se ha introducido correctamente, ejecutar los comandos. (suponiendo que no se haya autenticado recientemente para sudo... si lo ha hecho, se ejecutará sin preguntar)

Joe
fuente