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.