내 기능이 있습니다 ~/.zshrc
:
findPort() {
lsof -t -i :$1
}
일반적인 호출은 findPort 3306
입니다.
높은 권한으로 실행하고 싶습니다. 그러나 “명령을 찾을 수 없습니다”라는 메시지가 나타납니다.
➜ git ? sudo findPort 3306
sudo: findPort: command not found
이유는 루트 사용자가 비 대화식 쉘로 실행하거나 (.zshrc를 참조하지 않음) 다른 것을 참조하기 때문.zshrc
입니다.
에 관한 비슷한 질문을 보았지만 alias
사용자 정의 함수에 관한 질문은 없습니다. 이 문제에 대한 답은 다음 alias
에 별칭을 추가하는 것입니다 ~/.zshrc
.
alias sudo='nocorrect sudo '
또는 아마도 :
alias sudo='sudo '
이 두 가지 솔루션을 모두 시도했지만 문제가 계속 발생합니다 (예 : 셸을 다시 시작했습니다).
또한 sudo chsh
루트 쉘이 아래에서 실행되도록 실행 을 시도했습니다 zsh
. 이러한 솔루션 중 어느 것도 “명령을 찾을 수 없음”문제를 제거하지 못합니다.
sudo에서 사용자 정의 함수를 실행하는 방법이 있습니까?
답변
sudo
하지 쉘을 통해 직접 명령을 실행하고 그 명령을 실행 쉘을 실행하더라도, 그것은 당신의 읽는 하나의 새로운 쉘 호출, 그리고 않을 것이다 ~/.zshrc
(이 대화 형 쉘을 시작하더라도, 그것은 아마 읽을 것 root
‘들 변수를 재설정하지 않도록 ~/.zshrc
구성하지 않는 한 사용자가 sudo
아닙니다 $HOME
).
여기, sudo
새로운 zsh
쉘 을 시작 하라고 말하고, 그 기능을 실행하기 전에 zsh
읽어 보라고 지시 ~/.zshrc
해야합니다.
sudo zsh -c '. $0; "$@"' ~/.zshrc findPort 3306
또는:
sudo zsh -c '. $0; findPort 3306' ~/.zshrc
또는 현재 zsh 함수를 다음에 zsh
의해 호출 된 새로운 기능과 공유하십시오 sudo
.
sudo zsh -c "$(functions); findPort 3306"
당신은 얻을 수 있지만 너무 오래 인수 목록을 당신이 (완료 시스템을 사용하는 경우 등) 정의 함수의 많은 경우 오류가 발생했습니다. 따라서 findPort
함수 (및 함수가있는 경우 다른 모든 함수) 로 제한 할 수 있습니다 .
sudo zsh -c "$(functions findPort); findPort 3306"
당신은 또한 할 수 있습니다 :
sudo zsh -c "(){$functions[findPort]} 3306"
3306 인수를 전달 findPort
하는 익명 함수 에 함수 코드를 포함합니다 . 또는:
sudo zsh -c "$functions[findPort]" findPort 3306
(에 전달 인라인 스크립트 -c
인 함수 본문).
다음과 같은 도우미 기능을 사용할 수 있습니다.
zsudo() sudo zsh -c "$functions[$1]" "$@"
사용하지 마세요:
sdo () {sudo zsh -c "() {$ functions [$ 1]} $ {@ : 2}"}
의 논쟁 sdo
은 다른 수준의 쉘 파싱을 겪을 것이다. 비교:
$ e() echo "$@"
$ sdo e 'tname;uname'
tname
Linux
$ zsudo e 'tname;uname'
tname;uname
답변
매우 간단한 해결책은 sudo -s
macOS 번들 버전의 zsh (5.2)에서 작동하는 것처럼 보이는을 사용하여 대화식 쉘을 호출하는 것 입니다. 이것은 내 기능을 제공합니다.~/.zshrc
.
sudo 맨 페이지에서이 동작을 실제로 암시하지는 않습니다.
-s, –shell
SHELL 환경 변수에 의해 지정된 쉘 (설정된 경우) 또는 호출하는 사용자의 암호 데이터베이스 항목에 의해 지정된 쉘을 실행하십시오. 명령이 지정되면 쉘의 -c 옵션을 통해 실행되도록 쉘로 전달됩니다. 명령을 지정하지 않으면 대화식 쉘이 실행됩니다.
유스 케이스가 무엇인지 잘 모르겠지만 대화 형 솔루션을 찾고 있다고 생각합니다.
답변
재사용 가능한 속기 를 만들 수있었습니다 Stéphane Chazelas의 답변에 설명 된 솔루션 중 하나에 대한 . [편집 : Stéphane은 내가 제안한 원래 바로 가기를 반복했습니다. 여기에 설명 된 코드는 그의 최신 버전입니다.]
이것을 당신의 것으로 ~/.zshrc
:
sdo() sudo zsh -c "$functions[$1]" "$@"
이제 사용할 수 있습니다 sdo
“sudo
사용자 정의 함수 전용”으로 .
sdo
작동 하는지 확인하려면 : 사용자 이름을 인쇄하는 사용자 정의 함수에서 시도해 볼 수 있습니다.
➜ birch@server ~/ ? test() whoami
➜ birch@server ~/ ? test
birch
➜ birch@server ~/ ? sdo test
root
답변
이것은 나를 위해 작동하는 것 같습니다 :
function sudo (){
args="$@"
/run/wrappers/bin/sudo -u "$USER" zsh -i -c "$args"
}