如果它具有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
此处给出的答案是正确的,但是您将其否决并表示它们是错误的。不要仅仅因为您已经看到的其他内容而忽略正在说的内容。
理查德·霍洛威

3
真有趣……他想sudo cd工作,但是他使用sudo或su否决了解决方案。他说他不想以root身份工作,但是他仍然想直接访问他不拥有的目录。听起来像是个巨魔……
MestreLion 2011年

Answers:


110

sudo cd由于cd命令已内置到外壳中,因此无法使用。因此,您说的是成为root用户,然后运行此命令。您成为root用户,然后搜索sudo之后的命令,但没有cd找到命令。

使用的方法是切换到拥有目录的用户。权限700的意思是“所有者可以读取,写入和执行”。

因此,如果root拥有directory sudo -i,password,那么那cd {dir}是唯一正确的方法。如果其他人拥有该目录,则您仍然可以使用第一种方法,但也可以将其更改为该用户,su {username}然后cd将该用户用作该用户。


附带的问题:即使root不是所有者,root能否输入700 dir?
MestreLion

3
是的,MestreLion,700不会阻止root进入。权限“ 000”将阻止用户输入自己的权限(是的,用户可以创建他自己无法输入的目录...),但root用户仍然可以输入该目录。
Rinzwind

1
echo是一个shell内置命令,为什么我可以运行“ sudo echo”但不能运行“ sudo cd”?
shoujs '16

抱歉,同样的规则也适用于sudo echo:您需要echo 'deb {text}' | sudo tee --append {file}将sudo与echo一起使用并更改文件。
林兹温德

1
但是,为什么没有cd内置到的命令中sudo呢?
亚伦·弗兰克

44

sudo -i

打开“根控制台”,然后

cd /path/to/directory

cd是shell内置命令,因此不能成为sudo目标)


18

要打开一个根目录,我们可以运行一个根shell,例如:

sudo su
# cd /root

3
我不想扎根。决不!!!而且专家建议不要以root用户身份登录。-1
Bakhtiyor

8
这就是为什么您不希望打开根目录的权限,不是吗?
塔卡特2011年

10
进入root模式没有错。专家将始终建议在需要时扎根。
Rinzwind

2
如果您使用的是root拥有的东西,则有时sudo suing(或其他方法)是唯一实际甚至可能的方法。“专家”仅告诉您不要使用root作为习惯-实际需要时可以使用。还有@Vojtech,一切皆有可能...
奥利

2
@Bakhtiyor:确实不建议一直以root 身份工作。但是为单个(或几个)命令发布它是可以接受的。特别是如果您尝试输入您的用户无权访问的目录。因此,您需要是所有者或根。
MestreLion

10

正如其他人指出的那样-它是内置的shell:

~ % which cd
cd: shell built-in command

那么,为什么不对外壳本身进行sudo处理呢?

~ % sudo $SHELL -c "cd name_of_dir"

5
+1为sudo bash -c想法...和一个建议:避免使用which。它只是一个脚本,不会处理所有可能性(二进制,内置,别名等)。使用type代替。更安全,强大和便携。并type -p为可执行文件的路径。
MestreLion 2011年

1
好吧,取决于type [ -wfpams ] name ... Equivalent to whence -v.;which [ -wpams ] name ... Equivalent to whence -c.
Daniel Bauke 2011年

1
依赖。whencezsh-只......它并没有在bash工作,它甚至不是默认Ubuntu的安装。虽然typePOSIX,这意味着它可以在任何现代shell ... bash,csh,ksh ..甚至zsh中运行。
MestreLion

当然,这就是为什么我在评论出现时就对您的评论进行了投票,但是我想说的是,在zsh中,它实际上不是脚本,并且给出相似的结果,type因为两者都是同一命令的别名。
丹尼尔·鲍克

哦,我现在明白了。好吧,不过那是在zsh。在bash中,这which不是Ubuntu中的默认(通常是唯一的)终端外壳,不是内置的...因此,type(或type -p)是首选。
MestreLion

4

您还可以通过以下方式将自己提升为root用户:

sudo -s

然后,您可以cd到不允许普通用户访问的任何目录,例如:

cd /root

要么

cd /var/lib/

然后,在其中完成之后,输入:

exit

注销root用户特权。

为了提升自己的root权限,您还可以&&按如下所示将两个命令按操作符组合,如果当前命令成功执行并且只有下一个命令才能执行,该操作符也会维护它们的执行顺序:

sudo -s && cd /var/lib

要么

sudo -s && cd /root

2

如果您真的想工作,可以定义一个名为shell的函数,该函数以这种方式运行时将运行新的根shell,否则仅运行常规命令。sudo cd directorybashsudosudo

在其他的答案提出的,大多数用户希望打扰这样做,而是将希望:

  1. 运行sudo -s,或者sudo -i如果您想要登录外壳程序(请记住,一种作用sudo -i是将您从根目录的主目录中启动),或者sudo bash您想要强制bash或能够将选项传递给外壳程序。
  2. 在新的外壳中运行。cd directory
  3. 在新Shell中执行需要作为root采取的所有(其他)操作。
  4. 完成后,运行exit以离开新的外壳。重要的是不要忘记这一点,因为您不想以root用户的身份执行比预期更多的操作!

因此,如果需要,您可以编写一个shell函数(或脚本),该函数在sudo后跟时执行这些操作的前两个操作cdsudo否则将正常运行。请不要将其用作学习为什么 sudo cd无法成功的替代方法,因为如果您不了解正在发生的事情,那么您可能会因为被新的shell感到非常困惑(而且您可能不理解任何错误消息)发生)。

这是编写此类Shell函数的一种方法,它还提醒您您在新的Shell中,exit完成后应退出该外壳。(这提醒很可能是对用户有用的任何技能水平,因为一个不一般习惯于在一个新的shell是当一个运行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。这在当前的shell及其子shell中生效,但在其他shell中无效。由于类似.bashrc的文件不可执行的相同原因,请勿使用标记sudo.bash可执行文件chmod。这实际上是一个库,而不是一个独立的Shell脚本。如果你做了作为shell脚本运行它,它将定义函数...但是只能在运行脚本的shell中使用,而不适合作为调用方的您。(当然,您可以为此编写脚本,而这恰恰不是我在这里采用的方法。)

要检查并查看sudo当前是否被定义为shell函数,并查看其当前定义(如果是),请运行type sudo。要在定义函数后禁用(即取消定义)该函数,请运行unset -f sudo。要sudo即使定义了shell函数也直接手动运行常规命令,请运行command sudo。但是请注意,你不要这样做,因为这个sudo功能实际上做的是自己,只要有多于或少于两个参数传递给它还是第一个参数传递给它的是什么,但cd这就是为什么您仍然可以按人们通常使用的方式使用它sudo

还要注意,上面显示的shell函数仍然允许您将其他参数传递给它sudo但这将阻止它被cd特殊对待。尽管可以扩展shell函数以支持这种情况,但不支持特别运行。也不是。它创建的外壳与您获得的外壳类似。该代码实际上并未运行,而是使用,因此该选项正常运行。当您传递它时,它实际上会运行两次,并为其传递目录参数(否则为零)。当您运行时,首先它会从您正在运行该函数的shell派生一个单独的bash shell ,并更改目录。如果成功,它将替换sudo -u user cd directorysudo -i cd directorysudo -ssudo -ssudo bash-cbashcdsudo cd directorysudo 该bash外壳带有一个您可以使用的新的交互式外壳。

这是壳函数如何自动“做正确的事”的示例。请注意,它的sudo ls -A /root行为正常。只有当我尝试使用cd该目录时,sudo才会创建一个新的shell,并且明确提醒我正在发生的事情。

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一个甚至不能以root用户身份也无法更改的目录,那么您将收到一条错误消息:

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在上面的示例中,我在两次调用之间使用过它,以表明它尝试更改目录之前已以root用户身份进行身份验证。但是实际上您不必sudo -k自己运行。由于shell函数只是实际sudo命令的一个薄包装,因此缓存凭据和其他常见sudo行为仍然可以正常进行。

尽管它运行良好并且很整洁,但我承认sudo用相同名称的功能遮盖真实命令实在是太不可思议了。大多数用户可能只是想执行的步骤sudo -s,他们自己。但是,如果有人想要这样做,并证明它是可能的,那么它确实存在。cd directory


0

至于su是否su辩论,我认为这很愚蠢。su与Ubuntu宗教背道而驰,这不是一件容易的事。rm -rf *如果您是root,那么该怎么办呢。但是,如果您对命令行界面(CLI)感到满意并且要执行系统级任务,则没有理由不使用su。我使用过几个发行版,甚至没有人提到使用sudo。这仅取决于您正在从事哪种工作以及最适合哪种方法。我都用。


1
“在bash的版本中,sudo我使用kubuntu lucid,sudo cd现在可以使用-没有任何变通方法。” 缺少类似东西,我敢肯定默认情况下从来没有在Ubuntu中使用过,我不知道如何做到。(此外,我使用的是10.04;它没有这样做。)自您发布此信息已有好几年了,但是您还记得详细信息吗?是否sudo cd还在为你工作?type -a sudo在工作的shell中输出是什么?我了解您可能不知道-答案的第二部分仍然有意义-但如果您知道,则可以对其进行编辑
伊莱亚·卡根

@EliahKagan现在在16.10中肯定对我不起作用,我不记得那时的情况。修改现有的基本命令违反我的信仰,因此我不太可能这样做。无论如何,即使它确实起作用了,每个人都会称其为坏习惯,因为它通常不会起作用。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.