Mam funkcję w moim ~/.zshrc
:
findPort() {
lsof -t -i :$1
}
Zwykłe wywołanie to findPort 3306
.
Chcę uruchomić go z podwyższonymi uprawnieniami. Ale dostaję „polecenie nie znaleziono”.
➜ git 🍔 sudo findPort 3306
sudo: findPort: command not found
Zakładam, że powodem jest to, że użytkownik root albo działa jako nieinteraktywna powłoka (dlatego nie odnosi się do .zshrc), albo odnosi się do innej .zshrc
.
Widziałem podobne pytania dotyczące alias
, ale nie ma pytań dotyczących funkcji zdefiniowanych przez użytkownika. Odpowiedzi na ten problem alias
dotyczą dodania aliasu do ~/.zshrc
:
alias sudo='nocorrect sudo '
A może:
alias sudo='sudo '
Wypróbowałem oba te rozwiązania, a problem nadal występuje (tak, ponownie uruchomiłem powłokę).
Próbowałem także uruchomić, sudo chsh
aby upewnić się, że moja powłoka root działa zsh
. Żadne z tych rozwiązań nie usuwa problemu „nie znaleziono polecenia”.
Czy istnieje sposób uruchamiania moich funkcji zdefiniowanych przez użytkownika w sudo?
Odpowiedzi:
sudo
uruchamia polecenia bezpośrednio, a nie za pomocą powłoki, a nawet jeśli prowadził powłoki do uruchomienia tej komendy, że będzie to nowa powłoka wezwanie, a nie taki, który czyta swoje~/.zshrc
(nawet jeśli to się zaczęło interaktywną powłokę, będzie to prawdopodobnie odczytaćroot
„s~/.zshrc
, nie twój, chyba że skonfigurowano,sudo
aby nie resetować$HOME
zmiennej).Tutaj powinieneś powiedzieć,
sudo
aby uruchomić nowązsh
powłokę i powiedzieć,zsh
aby przeczytać ją~/.zshrc
przed uruchomieniem tej funkcji:Lub:
Lub, aby udostępnić bieżące funkcje zsh nowemu
zsh
wywołanemu przezsudo
:Chociaż może pojawić się zbyt długi błąd listy argumentów, jeśli zdefiniowano wiele funkcji (na przykład podczas korzystania z systemu uzupełniania). Możesz więc chcieć ograniczyć go do
findPort
funkcji (i każdej innej funkcji, na której polega, jeśli taka istnieje):Możesz także:
Aby osadzić kod
findPort
funkcji w funkcji anonimowej, do której należy przekazać argument 3306. Lub nawet:(przekazany skrypt wbudowany
-c
jest treścią funkcji).Możesz użyć funkcji pomocnika, takiej jak:
Nie używaj:
Ponieważ argumenty
sdo
zostaną poddane kolejnemu poziomowi analizy składniowej powłoki. Porównać:źródło
sudo
. Byłem w stanie dostosować twoje anonimowe rozwiązanie funkcji do tego właśnie. Dodałem do mojej funkcji następującą funkcję~/.zshrc
, która służy do uruchamiania innych funkcji z podwyższonymi uprawnieniami:sdo() { sudo zsh -c "(){$functions[$1]} ${@:2}" }
Bardzo prostym rozwiązaniem było dla mnie wywołanie interaktywnej powłoki
sudo -s
, która wydaje się działać na mojej wersji Zsh (5.2) w pakiecie z macOS. To zapewnia mi funkcje z mojego~/.zshrc
.Ze strony sudo, która tak naprawdę nie wskazuje na to zachowanie:
Nie jestem pewien, jaki jest twój przypadek użycia, ale podejrzewam, że szukasz interaktywnego rozwiązania.
źródło
myFunc
przez użytkownika , poprzez wpisaniesudo myFunc
- w ten sam sposób, w jaki podniosłbym dowolny proces (jaksudo rm -rf .
). To rozwiązanie podnosi cały mój monit i wszystkie przyszłe funkcje, a także zmienia mojego użytkownika na wszystkie przyszłe funkcje - co jest nieco przesadzone.sudo -s
Komenda uruchomi kolejną instancję swojej skorupy jako administrator. Jeśli wykonasz to polecenie interaktywnie, twoja nowa powłoka będzie interaktywna. Ale poleceniesudo -s findPort 3306
uruchomi poleceniefindPort 3306
w powłoce jako administrator, a następnie zakończy działanie z kodem statusu tego polecenia.Byłem w stanie wyprodukować stenogram wielokrotnego użytku dla jednego z rozwiązań opisanych w Stéphane Chazelas' odpowiedź . [Edycja: Stéphane powtórzył pierwotny skrót, który zaproponowałem; opisany tu kod jest nowszą wersją jego tworzenia]
Włóż to do swojego
~/.zshrc
:Teraz możesz użyć
sdo
jako „tylkosudo
dla funkcji zdefiniowanych przez użytkownika”.Aby potwierdzić, że
sdo
działa: możesz wypróbować to na funkcji zdefiniowanej przez użytkownika, która drukuje twoją nazwę użytkownika.źródło
Wydaje mi się, że to działa:
źródło