Eu tenho uma função no meu ~/.zshrc
:
findPort() {
lsof -t -i :$1
}
A invocação usual é findPort 3306
.
Eu quero executá-lo com privilégios elevados. Mas eu recebo "comando não encontrado".
➜ git 🍔 sudo findPort 3306
sudo: findPort: command not found
Presumo que o motivo é que o usuário root é executado como um shell não interativo (portanto, não se refere a um .zshrc) ou se refere a um diferente .zshrc
.
Tenho visto perguntas semelhantes a respeito alias
, mas nenhuma pergunta sobre funções definidas pelo usuário. As respostas para esse problema relacionadas à alias
adição de um alias para ~/.zshrc
:
alias sudo='nocorrect sudo '
Ou talvez:
alias sudo='sudo '
Eu tentei essas duas soluções e o problema ainda existe (sim, relancei o shell).
Também tentei executar sudo chsh
para garantir que meu shell raiz seja executado sob zsh
. Nenhuma dessas soluções remove o problema "comando não encontrado".
Existe uma maneira de executar minhas funções definidas pelo usuário no sudo?
Respostas:
sudo
executa comandos diretamente, e não através de um shell, e mesmo que correu um shell para executar esse comando, seria uma nova chamada de shell, e não aquele que lê seus~/.zshrc
(mesmo que começou um shell interativo, seria provavelmente lerroot
's~/.zshrc
, não o seu, a menos que você tenha configuradosudo
para não redefinir a$HOME
variável).Aqui, você precisa informar
sudo
para iniciar um novozsh
shell e informarzsh
para ler o seu~/.zshrc
antes de executar essa função:Ou:
Ou, para compartilhar suas funções zsh atuais com o novo
zsh
invocado porsudo
:Embora você possa receber um erro muito longo da lista arg se tiver muitas funções definidas (como ao usar o sistema de conclusão). Portanto, você pode limitá-lo à
findPort
função (e a qualquer outra função em que dependa):Você também pode fazer:
Para incorporar o código da
findPort
função em uma função anônima à qual você passa o argumento 3306. Ou até:(o script embutido passado para
-c
é o corpo da função).Você poderia usar uma função auxiliar como:
Não use:
Como os argumentos de
sdo
passariam por outro nível de análise de shell. Comparar:fonte
sudo
. Consegui adaptar sua solução de função anônima para fazer exatamente isso. Eu adicionei a seguinte função ao meu~/.zshrc
, que é uma função para executar outras funções com privilégios elevados:sdo() { sudo zsh -c "(){$functions[$1]} ${@:2}" }
Uma solução muito simples para mim foi chamar um shell interativo usando
sudo -s
, que parece funcionar na minha versão do zsh (5.2) do macOS. Isso me fornece as funções do meu~/.zshrc
.Na página de manual do sudo, que realmente não sugere esse comportamento:
Não sei ao certo qual é o seu caso de uso, mas suspeito que você esteja procurando uma solução interativa.
fonte
myFunc
, digitandosudo myFunc
- da mesma maneira que elevaria qualquer processo (comosudo rm -rf .
). Essa solução eleva meu prompt inteiro e todas as funções futuras, além de alterar meu usuário para todas as funções futuras - o que é um pouco exagerado.sudo -s
comando iniciará outra instância do seu shell como superusuário. Se você executar esse comando interativamente, seu novo shell será interativo. Mas o comandosudo -s findPort 3306
executará o comandofindPort 3306
no seu shell como superusuário e sairá com o código de status desse comando.Consegui produzir uma abreviação reutilizável para uma das soluções descritas na resposta de Stéphane Chazelas . [Editar: Stéphane repetiu o atalho original que propus; o código descrito aqui é uma versão mais recente de sua criação]
Coloque isso no seu
~/.zshrc
:Agora você pode usar
sdo
como "apenassudo
para funções definidas pelo usuário".Para confirmar que
sdo
funciona: você pode testá-lo em uma função definida pelo usuário que imprime seu nome de usuário.fonte
Isso parece funcionar para mim:
fonte