실제로 작업 하기를 원한다면 그렇게 할 때 새 루트 셸을 실행하고 그렇지 않으면 일반 명령 을 실행하는 셸 함수를 정의 할 수 있습니다 .sudo cd directory
bash
sudo
sudo
다른 답변에 제시된 바와 같이, 대부분의 사용자는 것입니다 하지 그 일을 방해하려는 대신에 원할 것입니다 :
- 을 실행
sudo -s
하거나 sudo -i
로그인 쉘을 원 하거나 (그 효과 중 하나 sudo -i
가 루트의 홈 디렉토리에서 시작 하는 것임을 명심하십시오 ), 또는 옵션을 쉘 sudo bash
에 강제 bash
로 전달하거나 전달 하려는 경우 실행하십시오 .
- 새 쉘에서 실행하십시오 .
cd directory
- 새 셸에서 루트로 취해야 할 작업은 모두 수행하십시오.
- 완료되면
exit
새 쉘을 떠나도록 실행 하십시오. 의도 한 것보다 루트로 더 많은 작업을 수행하고 싶지 않기 때문에 이것을 잊지 않는 것이 중요합니다!
따라서 원하는 경우 sudo
뒤에 오는 두 가지 작업을 수행하고 그렇지 않으면 정상적으로 cd
실행 되는 셸 함수 (또는 스크립트)를 작성할 수 있습니다 sudo
. 무슨 일이 일어나고 있는지 이해하지 못하면 새로운 쉘에 들어 와서 매우 혼란 스러울 수 있습니다 (오류 메시지를 이해 하지 못할 수도 있음). 그렇지 않으면 왜 성공하지 못하는지 를 배우는 대안으로 이것을 사용 하지 마십시오 sudo cd
발생).
이러한 쉘 함수를 작성하는 한 가지 방법이 있습니다. 이는 또한 새로운 쉘 exit
을 사용 중이고 완료되면 종료 해야 함을 상기시킵니다 . (즉, 미리 알림의 사용자에게 유용 될 가능성이 있는 하나 하나가 실행될 때 새로운 쉘에있는 일반적으로 익숙하지 않기 때문에, 기술 수준 sudo
하지 않고 -s
, -i
또는 인수로 실제 쉘의 이름입니다.)
# Make sudo treat "sudo cd [DIRECTORY]" as a special case and start a shell.
sudo() {
if [ "$#" -eq 2 ] && [ "$1" = 'cd' ]; then
sudo bash -c '
if cd -- "$2"; then # When cd fails, its own message is enough.
printf "%s: Running %s shell in %s\n" "$0" "$USER" "$2" >&2
printf "%s: Type \"exit\" once you are done!\n" "$0" >&2
exec bash # Replace this bash shell with an interactive one.
fi
' bash _ "$2" # Use $2 as the dir in the intermediate shell, too.
else
command sudo "$@"
fi
}
이 기능을에 넣을 수는 ~/.bashrc
있지만 sudo
가끔 사용하도록 설정 하는 이상한 방법 입니다. 이 경우 자체 파일에 저장하는 것이 좋습니다. sudo.bash
해당 내용으로 홈 디렉토리에 호출 된 파일을 작성하는 경우을 sudo
실행 하여 기능을 사용 가능 하게 하여 일반 sudo
명령 대신 실행되도록 할 수 있습니다 . ~/sudo.bash
. 현재 쉘과 그 자식 쉘에는 적용되지만 다른 쉘에는 적용되지 않습니다. 같은 파일 .bashrc
이 실행 가능하지 않은 것과 같은 이유로 sudo.bash
실행 파일을로 표시하지 마십시오 chmod
. 이것은 실제로 독립형 쉘 스크립트가 아닌 라이브러리입니다. 네가 했다면쉘 스크립트로 실행하면 함수를 정의 할 수 있지만 스크립트를 실행 한 쉘에서만 호출자가 아닙니다. (물론, 내가 여기에 접근 한 방식으로는 발생하지 않는 스크립트를 작성할 수 있습니다.)
sudo
현재 쉘 함수로 정의되어 있는지 확인하고 현재 정의 인지 확인하려면을 실행하십시오 type sudo
. 정의 된 함수를 비활성화 (즉, 정의 해제)하려면을 실행하십시오 unset -f sudo
. sudo
쉘 함수가 정의되어 있어도 일반 명령을 직접 수동으로 실행하려면을 실행하십시오 command sudo
. 당신이하지 않는 점에 유의 해야 이 있기 때문에,이를 위해 sudo
기능이 실제로있을 때마다 그것은 아무것도하지만입니다에 더하거나 또는 1 번째의 인수로 전달보다 적은 두 개의 인수 전달 자체 것으로 않습니다 cd
. 그래서 사람들이 사용하는 일반적인 방식으로 계속 사용할 수 있습니다 sudo
.
위의 쉘 기능은 여전히 다른 인자를 전달하도록 않습니다 유의하십시오 sudo
, 하지만이 치료되는 것을 방지합니다 cd
특별히 . 쉘 기능을 확장하여 해당 경우를 지원할 수는 있지만 특히 실행 은 지원되지 않습니다. 도 아니다 . 그것이 만드는 쉘은 당신이 얻는 것과 비슷합니다 . 코드는 실제로 실행되지 않지만을 사용 하므로 옵션이 올바르게 작동합니다. 전달할 때 실제로 두 번 실행 되고 디렉토리 인수가 전달됩니다 (그렇지 않으면 0 번). 를 실행 하면 먼저 함수를 실행하는 디렉토리와 별도의 bash 쉘을 분기 하고 디렉토리를 변경합니다. 성공하면 교체sudo -u user cd directory
sudo -i cd directory
sudo -s
sudo -s
sudo bash
-c
bash
cd
sudo cd directory
sudo
bash 쉘을 새로운 대화식 쉘로 사용할 수 있습니다.
다음은 그 쉘 함수가 자동으로 "올바른 일을하는"방법의 예입니다. 공지 사항 sudo ls -A /root
정상적으로 동작합니다. 그런 다음 cd
디렉토리를 사용 sudo
하여 새 쉘을 만들 려고 할 때만 진행 상황을 명시 적으로 상기시킵니다.
ek@Io:~$ sudo ls -A /root
[sudo] password for ek:
.aptitude .bashrc .config .emacs.d .nano .rpmdb
.bash_history .cache .dbus .local .profile
ek@Io:~$ sudo -k # invalidates my current timestamp... like I left for a while
ek@Io:~$ sudo cd /root/.local
[sudo] password for ek:
bash: Running root shell in /root/.local
bash: Type "exit" once you are done!
root@Io:/root/.local#
root@Io:/root/.local#
root@Io:/root/.local# exit
exit
ek@Io:~$
sudo cd
루트로도 변경할 수없는 디렉토리 로 이동 하려고 하면 오류 메시지가 나타납니다.
ek@Io:~$ sudo cd /nonexistent
[sudo] password for ek:
bash: line 1: cd: /nonexistent: No such file or directory
ek@Io:~$ sudo -k
ek@Io:~$ sudo cd /etc/crontab
[sudo] password for ek:
bash: line 1: cd: /etc/crontab: Not a directory
ek@Io:~$
내가 사용하고 sudo -k
이 루트로 당신을 인증하는 것을 보여주기 위해 위의 예에서 호출 사이에 전에 디렉토리를 변경하려고. 그러나 실제로 sudo -k
자신 을 실행할 필요는 없습니다 . 쉘 함수는 실제 sudo
명령에 대한 간단한 래퍼 이므로 자격 증명 및 기타 일반적인 sudo
동작의 캐싱은 여전히 정상적으로 작동합니다.
잘 작동하고 깔끔하지만, sudo
같은 이름의 함수로 실제 명령 을 음영 처리하는 것은 매우 이상 하다는 것을 인정합니다 . 대부분의 사용자는 아마 단계를 수행 할 것 sudo -s
, 자신을. 그러나 누군가가 이것을 원하고 또한 가능하다는 것을 입증하기 위해 가능하다면.cd directory
ls -l
디렉토리 자체 를 추가하십시오 .