Tengo una función en mi ~/.zshrc
:
findPort() {
lsof -t -i :$1
}
La invocación habitual es findPort 3306
.
Quiero ejecutarlo con privilegios elevados. Pero me sale "comando no encontrado".
➜ git 🍔 sudo findPort 3306
sudo: findPort: command not found
Supongo que la razón es que el usuario raíz se ejecuta como un shell no interactivo (por lo tanto, no se refiere a un .zshrc) o se refiere a otro .zshrc
.
He visto preguntas similares con alias
respecto a las funciones definidas por el usuario, pero ninguna. Las respuestas a este problema alias
implican agregar un alias a ~/.zshrc
:
alias sudo='nocorrect sudo '
O quizás:
alias sudo='sudo '
He intentado ambas soluciones y el problema persiste (sí, he relanzado el shell).
También he intentado ejecutar sudo chsh
para asegurarme de que mi shell raíz se ejecuta por debajo zsh
. Ninguna de estas soluciones elimina el problema "comando no encontrado".
¿Hay alguna manera de ejecutar mis funciones definidas por el usuario en sudo?
Respuestas:
sudo
ejecuta comandos directamente, no a través de una concha, e incluso si se corrió una concha para ejecutar ese comando, sería una nueva llamada al shell, y no uno que lee sus~/.zshrc
(incluso si se ha iniciado un shell interactivo, es probable que leerroot
's~/.zshrc
, no el suyo, a menos que haya configuradosudo
para no restablecer la$HOME
variable).Aquí, debe indicarle
sudo
que inicie un nuevozsh
shell, y quezsh
lea su~/.zshrc
antes de ejecutar esa función:O:
O para compartir sus funciones zsh actuales con las nuevas
zsh
invocadas porsudo
:Aunque puede obtener un error de lista arg demasiado larga si tiene muchas funciones definidas (como cuando usa el sistema de finalización). Por lo tanto, es posible que desee limitarlo a la
findPort
función (y a cualquier otra función en la que se base si existe)También puedes hacer:
Para incrustar el código de la
findPort
función en una función anónima a la que pasa el argumento 3306. O incluso:(el script en línea pasado a
-c
es el cuerpo de la función).Puede usar una función auxiliar como:
No utilice:
Como los argumentos de
sdo
sufrirían otro nivel de análisis de shell. Comparar:fuente
sudo
. Pude adaptar su solución de función anónima para hacer precisamente eso. He agregado la siguiente función a mi~/.zshrc
, que es una función para ejecutar otras funciones con privilegios elevados:sdo() { sudo zsh -c "(){$functions[$1]} ${@:2}" }
Una solución muy simple para mí fue invocar un shell interactivo usando
sudo -s
, que parece funcionar en mi versión de zsh (5.2) incluida en macOS. Esto me proporciona las funciones de mi~/.zshrc
.Desde la página de manual de sudo, que realmente no sugiere este comportamiento:
No estoy seguro de cuál es su caso de uso, pero sospecho que está buscando una solución interactiva.
fuente
myFunc
, escribiendosudo myFunc
, de la misma manera que elevaría cualquier proceso (comosudo rm -rf .
). Esta solución eleva mi solicitud completa y todas las funciones futuras, además de cambiar mi usuario para todas las funciones futuras, lo cual es un poco exagerado.sudo -s
comando lanzará otra instancia de su shell como superusuario. Si ejecuta ese comando de forma interactiva, su nuevo shell será interactivo. Pero el comandosudo -s findPort 3306
ejecutará el comandofindPort 3306
en su shell como superusuario y luego saldrá con el código de estado de ese comando.Pude producir una taquigrafía reutilizable para una de las soluciones descritas en la respuesta de Stéphane Chazelas . [Editar: Stéphane ha iterado en el atajo original que propuse; el código descrito aquí es una versión más nueva de su creación]
Pon esto en tu
~/.zshrc
:Ahora puede usarlo
sdo
como "solosudo
para funciones definidas por el usuario".Para confirmar que
sdo
funciona: puede probarlo en una función definida por el usuario que imprima su nombre de usuario.fuente
Esto parece funcionar para mí:
fuente