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.