Comment activer `sudo` avec des fonctions personnalisées?

Récemment, j'ai appris que vous pouvez activer sudo pour les alias personnalisés comme suit:

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

La raison pour laquelle cela fonctionne est la suivante:

Si le dernier caractère de la valeur de l'alias est un caractère d'espace ou de tabulation, le mot de command suivant après l'alias est également vérifié pour l'expansion de l'alias.

Ma question est: y at-il un moyen d'activer sudo avec des fonctions personnalisées aussi?

Dans le cas général, ce que vous essayez de faire ne fonctionne pas vraiment.

Avec les alias, il y a juste une réécriture de string avant que la ligne ne soit passée pour être exécutée.

Ainsi, par exemple, si vous avez

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

puis quand vous entrez sudo foo la command line est réécrite dans sudo bar baz et c'est ce qui est exécuté. C'est une simple réécriture en command line.

Maintenant, les fonctions sont plus difficiles. Ce ne sont pas de simples réécritures, mais une évaluation complète; ils peuvent définir des variables, modifier des directorys, ouvrir des files … à peu près tout ce que le shell peut faire. Et, surtout, ils sont exécutés dans le context de la coquille actuelle. Lorsque vous exécutez sudo myfunction alors rien de tout cela n'est possible; en particulier les commands sudo sont exécutées en tant que sous-process et ne peuvent donc pas affecter le shell courant.

Le work-around utilisé pour des choses comme le sudowrap mentionné ci-dessus est d'essayer de travailler automatiquement sudo bash -c 'myfunction() {...} ; myfunction' sudo bash -c 'myfunction() {...} ; myfunction' . Ceci appelle explicitement un nouveau sous-shell bash , puis exécute la fonction dans ce sous-shell. L'appel explicite indique clairement que des choses comme la définition de variables et autres ne fonctionneront pas 🙂 Cela permet un sous-set limité de fonctionnalités.

Le type de fonctions que vous pouvez appeler de cette façon peut être mieux réécrit sous forme de scripts shell plutôt que de fonctions; alors sudo peut les appeler directement. L'exemple donné à http://w00tbl0g.blogspot.com/2007/05/using-bash-functions-under-sudo.html serait plus simple si le duk converti en un exécutable

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

Cela fonctionnera alors comme prévu!