¿Cómo habilitar `sudo` con funciones personalizadas?

¿Cómo habilitar `sudo` con funciones personalizadas?

Recientemente aprendí que puedes habilitar sudoalias personalizados de la siguiente manera:

alias sudo='sudo ' # note: the space is required!

La razón por la que esto funcionaes el siguiente:

Si el último carácter del valor del alias es un espacio o un carácter de tabulación, también se comprueba la siguiente palabra de comando que sigue al alias para ver si hay expansión de alias.

Mi pregunta es: ¿hay alguna forma de habilitar sudotambién funciones personalizadas?

Respuesta1

En el caso general, lo que estás intentando hacer realmente no funciona.

Con los alias, prácticamente solo hay que reescribir la cadena antes de pasar la línea para su ejecución.

Así, por ejemplo, si tienes

alias sudo='sudo '
alias foo='bar baz'

luego, cuando ingresa, sudo foola línea de comando se reescribe sudo bar bazyesoes entonces lo que se ejecuta. Esta es una simple reescritura de línea de comando.

Ahora las funciones son más difíciles. No son simples reescrituras, sino una evaluación completa; pueden establecer variables, cambiar directorios, abrir archivos... prácticamente lo hacencualquier cosael caparazón puede hacerlo. Y, lo que es más importante, se ejecutan en el contexto del shell actual. Cuando corres sudo myfunction, nada de esto es posible; en particular, sudolos comandos se ejecutan como un subproceso y, por lo tanto, no pueden afectar el shell actual.

La solución alternativa utilizada para cosas como las sudowrapmencionadas anteriormente es intentar resolverlo automáticamente sudo bash -c 'myfunction() {...} ; myfunction'. Esto llama explícitamente a una nueva bashsubcapa y luego ejecuta la función en esa subcapa. La llamada explícita deja claro que cosas como configurar variables y similares no funcionarán :-) Permite un subconjunto limitado de funcionalidades.

El tipo de funciones que puede llamar de esta manera puede reescribirse mejor como scripts de shell en lugar de funciones; Entonces sudopuedes llamarlos directamente. El ejemplo dado enhttp://w00tbl0g.blogspot.com/2007/05/using-bash-functions-under-sudo.htmlSería más fácil si se hubiera dukconvertido a un ejecutable.

#!/bin/bash
exec du -k "$@" | sort -n

¡Eso funcionará como se esperaba!

información relacionada