Saltar al contenido

Ejecutar una función Bash Script con Sudo

Hola usuario de nuestra web, descubrimos la solución a lo que necesitas, has scroll y la hallarás a continuación.

Solución:

Admito que no hay una manera simple e intuitiva de hacer esto, y esto es un poco complicado. Pero, puedes hacerlo así:

function hello()

    echo "Hello!"


# Test that it works.
hello

FUNC=$(declare -f hello)
sudo bash -c "$FUNC; hello"

O más simplemente:

sudo bash -c "$(declare -f hello); hello"

Esto funciona para mi:

$ bash --version
GNU bash, version 4.3.42(1)-release (x86_64-apple-darwin14.5.0)
$ hello
Hello!
$
$ FUNC=$(declare -f hello)
$ sudo bash -c "$FUNC; hello"
Hello!

Básicamente, declare -f devolverá el contenido de la función, que luego pasa a bash -c en línea.

Si desea exportar todas las funciones desde la instancia externa de bash, cambie FUNC=$(declare -f hello) a FUNC=$(declare -f).

Editar

Para abordar los comentarios sobre las citas, vea este ejemplo:

$ hello()
> 
> echo "This 'is a' test."
> 
$ declare -f hello
hello ()

    echo "This 'is a' test."

$ FUNC=$(declare -f hello)
$ sudo bash -c "$FUNC; hello"
Password:
This 'is a' test.

El problema es ese sudo limpia el entorno (excepto por un puñado de variables permitidas) y establece algunas variables en valores seguros predefinidos para proteger contra riesgos de seguridad. en otras palabras, esto no es realmente un problema. Es una característica.

Por ejemplo, si establece PATH="/path/to/myevildirectory:$PATH" y sudo no configuró PATH en un valor predefinido, entonces cualquier script que no especificara el nombre de ruta completo para TODOS los comandos que ejecuta (es decir, la mayoría de los scripts) buscaría en /path/to/myevildirectory antes que cualquier otro directorio. Poner comandos como ls o grep u otras herramientas comunes allí y puede hacer fácilmente lo que quiera en el sistema.

La forma más fácil/mejor es volver a escribir la función como un script y guardarla en algún lugar de la ruta (o especificar la ruta completa al script en el sudo línea de comando, lo que deberá hacer de todos modos a menos que sudo está configurado para permitirle ejecutar CUALQUIER comando como root) y hacerlo ejecutable con chmod +x /path/to/scriptname.sh

Reescribir una función de shell como un script es tan simple como guardar los comandos dentro de la definición de la función en un archivo (sin la function ..., y líneas).

he escrito mi propio Sudo función bash para hacer eso, funciona para llamar funciones y alias:

function Sudo 
        local firstArg=$1
        if [ $(type -t $firstArg) = function ]
        then
                shift && command sudo bash -c "$(declare -f $firstArg);$firstArg $*"
        elif [ $(type -t $firstArg) = alias ]
        then
                alias sudo='sudo '
                eval "sudo [email protected]"
        else
                command sudo "[email protected]"
        fi

Recuerda que te brindamos la opción de decir si diste con el arreglo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *