700 권한이 있고 내가 소유하지 않은 경우 'cd'명령으로 디렉토리를 입력하는 방법은 무엇입니까?


86

사용하려고했지만 sudo cd name_of_dir오류 메시지가 나타납니다.

sudo: cd: command not found

700 권한이있는 다른 사용자가 소유 한 디렉토리를 입력하는 다른 방법이 있습니까?


2
ls -l디렉토리 자체 를 추가하십시오 .
— Rinzwind

7
여기에 유효한 답변에 대해 부정적인 의견을 남기는 이유를 설명하십시오. 더 나은 방법이 있다고 생각되면 어떻게해야하는지 알려주십시오.
— Oli

1
sudo chmod 0755 name_of_dir; do you business; cd ../; sudo chmod 0700 name_of_dir당신이 기뻐할 유일한 대답 인 것 같습니다.
— Marco Ceppi

3
여기에 주어진 대답은 정확하지만, 당신은 그들에게 투표하고 그들이 틀렸다고 말합니다. 당신이 본 것 때문에 말하고있는 것을 무시하지 마십시오.
— Richard Holloway '

3
재밌다. 그는 sudo cd일하고 싶어 하지만 sudo 또는 su를 사용하여 솔루션을 투표로 뽑는다. 그는 루트로 일하기를 원하지 않지만 여전히 자신이 소유하지 않은 직접 액세스를 원한다고 말합니다. 나에게 트롤 같은 소리 ...
— MestreLion

답변:


110

sudo cdcd명령이 셸에 내장되어 있기 때문에 작동하지 않습니다 . 그래서 루트가되었다고 말한 다음이 명령을 실행하십시오. 루트가 된 다음 sudo 이후의 명령을 검색하지만 cd찾을 명령 이 없습니다 .

사용하는 방법은 디렉토리를 소유 한 사용자로 전환하는 것입니다. 권한 700은 "소유자가 읽고, 쓰고 실행할 수 있습니다"를 의미합니다.

따라서 root가 디렉토리를 소유하고 있다면 sudo -ipassword 다음 cd {dir}유일한 방법입니다. 다른 사람이 디렉토리를 소유 한 경우에도 여전히 첫 번째 방법을 사용할 수 있지만 해당 사용자로 변경 su {username}한 다음 해당 사용자로 사용할 수도 있습니다 cd.


부차적 인 질문 : 루트가 소유자가 아니더라도 700 디렉토리에 들어갈 수 있습니까?
— MestreLion

3
예 MestreLion, 700은 루트의 진입을 중단하지 않습니다. 권한 '000'은 사용자가 자신을 입력하는 것을 막을 것입니다 (예, 사용자는 자신이 입력 할 수없는 디렉토리를 만들 수 있습니다 ...). 그러나 여전히 루트는 그 하나를 입력 할 수 있습니다.
— Rinzwind

1
echo는 쉘 내장 명령인데 왜 "sudo echo"를 실행할 수 있지만 "sudo cd"는 실행할 수 없습니까?
— shoujs

죄송합니다, 같은 규칙이 적용됩니다 sudo echo: echo 'deb {text}' | sudo tee --append {file}sudo와 함께 echo를 사용하고 파일을 변경하는 것과 같은 것이 필요 합니다.
— Rinzwind

1
그래도 cd사용할 수있는 명령 이없는 이유는 무엇 sudo입니까?
— Aaron Franke

44

sudo -i

"루트 콘솔"을 연 다음

cd /path/to/directory

( cd쉘 내장 명령이므로 sudo 대상이 될 수 없음)


18

루트 디렉토리를 열려면 다음과 같이 루트 쉘을 실행할 수 있습니다.

sudo su
# cd /root

3
나는 뿌리로 일하고 싶지 않습니다. 못!!! 또한 전문가는 절대 루트로 로그인하지 않는 것이 좋습니다. -1
— Bakhtiyor

8
이것이 바로 루트 디렉토리를 열 수있는 권한을 원하지 않는 이유입니다. 그렇지 않습니까?
— Takkat

10
루트 모드로 들어가는 데 아무런 문제가 없습니다. 전문가들은 필요할 때 항상 루트에 들어가는 것이 좋습니다.
— Rinzwind

2
루트가 소유 한 것들로 작업하는 경우 때때로 sudo suing (또는 다른 방법)이 유일한 실용적이거나 가능한 방법 일 수 있습니다. "전문가"는 루트를 습관으로 사용하지 말라고 지시합니다. 실제로 필요할 때는 괜찮습니다. 그리고 @Vojtech, 아무것도 불가능합니다 ...
— Oli

2
@Bakhtiyor : 루트로 전체 작업 은 실제로 권장되지 않습니다. 그러나 단일 (또는 몇 개의) 명령에 대해 발행하는 것은 허용됩니다. 특히 사용자에게 권한이없는 디렉토리를 입력하려는 경우 . 그래서 당신은 필요 소유자 또는 루트가 될 수 있습니다.
— MestreLion

10

다른 사람들이 지적했듯이 쉘 내장입니다.

~ % which cd
cd: shell built-in command

그렇다면 쉘 자체를 sudo하지 않으시겠습니까?

~ % sudo $SHELL -c "cd name_of_dir"

5
sudo bash -c idea +1 및 제안 사항 : + 사용하지 마십시오 which. 그것은 단지 스크립트이며 모든 가능성 (이진, 내장, 별명 등)을 처리하지는 않습니다. type대신 사용하십시오 . 훨씬 더 안전하고 강력하며 휴대 가능합니다. 그리고 type -p실행 파일의 경로.
— MestreLion

1
글쎄, ;-) type [ -wfpams ] name ... Equivalent to whence -v., which [ -wpams ] name ... Equivalent to whence -c.(man zshbuiltins)
— Daniel Bauke

1
의존 하지 않습니다 . whenceis zsh-only ... bash에서는 작동 하지 않으며 , 우분투에서는 기본적으로 설치되지 않습니다. 동안은 type입니다 POSIX 가에서 작동 의미, 어떤 zsh을도 .. 현대 쉘 ... 배시, csh, ksh를합니다.
— MestreLion

물론, 그것이 그렇기 때문에 나는 그것이 나타날 때 당신의 의견을 옹호 한 이유입니다. 그러나 zsh에서는 실제로 스크립트가 아니며 type둘 다 동일한 명령의 별칭이므로 비슷한 결과를 제공합니다 .
— Daniel Bauke

아, 이제 이해합니다. 글쎄 zsh. 우분투의 기본 (그리고 보통 유일한) 터미널 쉘 인 bash which는 내장되어 있지 않으므로 ... type또는 (또는 type -p)이 선호됩니다.
— MestreLion

4

다음을 통해 자신을 루트 사용자로 승격시킬 수도 있습니다.

sudo -s

그런 다음 일반 사용자를 허용하지 않는 디렉토리로 cd 할 수 있습니다.

cd /root

또는

cd /var/lib/

그런 다음 다음을 입력하십시오.

exit

루트 사용자 권한에서 로그 아웃합니다.

루트로 자신을 높이기 위해 다음과 같이 두 가지 명령을 &&연산자로 결합 할 수도 있습니다.이 연산자는 현재 명령이 성공적으로 실행되고 다음 명령 만 실행될 수 있으면 실행 순서를 유지합니다.

sudo -s && cd /var/lib

또는

sudo -s && cd /root

2

실제로 작업 하기를 원한다면 그렇게 할 때 새 루트 셸을 실행하고 그렇지 않으면 일반 명령 을 실행하는 셸 함수를 정의 할 수 있습니다 .sudo cd directorybashsudosudo

다른 답변에 제시된 바와 같이, 대부분의 사용자는 것입니다 하지 그 일을 방해하려는 대신에 원할 것입니다 :

  1. 을 실행 sudo -s하거나 sudo -i로그인 쉘을 원 하거나 (그 효과 중 하나 sudo -i가 루트의 홈 디렉토리에서 시작 하는 것임을 명심하십시오 ), 또는 옵션을 쉘 sudo bash에 강제 bash로 전달하거나 전달 하려는 경우 실행하십시오 .
  2. 새 쉘에서 실행하십시오 .cd directory
  3. 새 셸에서 루트로 취해야 할 작업은 모두 수행하십시오.
  4. 완료되면 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 directorysudo -i cd directorysudo -ssudo -ssudo bash-cbashcdsudo cd directorysudo 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


0

지금까지의로 su하거나하지 su논쟁, 나는 그것이 어리석은 생각합니다. su우분투의 종교에 위배되며 부주의하게 할 일이 아닙니다. rm -rf *뿌리 내면 할 수있는 일이 놀랍습니다 . 그러나 CLI (명령 줄 인터페이스)에 익숙하고 시스템 수준 작업을 수행해야하는 경우에는 사용할 수 없습니다 su. 아무도 사용하여 언급하지 않은 여러 배포판을 사용했습니다 sudo. 그것은 당신이하고있는 일의 종류와 가장 편안한 방법의 문제 일뿐입니다. 둘 다 사용합니다.


1
"bash 버전 sudo과 kubuntu lucid sudo cd를 사용하면 해결 방법 없이도 작동합니다." 짧은 그런 일 나는 기본적으로 우분투 적이 확신 해요, 내가 표시되지 않습니다. (또한 10.04를 사용했지만 그렇게하지 않았습니다.)이 게시물을 게시 한 지 몇 년이 지났지 만 세부 정보를 기억하십니까? sudo cd여전히 당신을 위해 작동 합니까 ? type -a sudo쉘에서 작동하는 결과는 무엇입니까 ? 나는 당신이 알지 못할 수도 있음을 이해합니다. 그리고 답의 두 번째 부분은 여전히 ​​관련이 있습니다. 그러나 그렇게하면 편집 할 수 있습니다 .
— Eliah Kagan

@EliahKagan 그것은 16.10에 지금 나에게 확실히 작동하지 않으며 그때 내가 한 일을 기억하지 못합니다. 기존의 기본 명령을 수정하는 것은 종교에 위배되므로 그렇게하지는 않습니다. 어쨌든 그것이 효과가 있더라도 모든 사람들은 그것이 일반적으로 효과가 없기 때문에 나쁜 습관이라고 부릅니다.
— Joe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.