如果它具有700个权限并且不归我所有,如何使用’cd’命令输入目录?

我尝试使用sudo cd name_of_dir但收到错误消息:

 sudo: cd: command not found 

有没有其他方法可以输入拥有700权限的其他用户拥有的目录?

sudo cd无法正常工作,因为cd命令内置于shell中。 所以你说成为root然后运行这个命令。 你成为root用户然后搜索sudo之后的命令,但没有找到cd命令。

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

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

sudo -i

然后打开“根控制台”

cd /path/to/directory

cd是一个shell内置命令,所以它不能是sudo目标)

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

 sudo su # cd /root 

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

 ~ % which cd cd: shell built-in command 

那么,你为什么不sudo shell本身呢?

 ~ % sudo $SHELL -c "cd name_of_dir" 

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

 sudo -s 

然后你可以cd到任何不允许普通用户的目录:

 cd /root 

要么

 cd /var/lib/ 

在你完成之后输入:

 exit 

注销root用户权限。

为了以root身份提升自己,您还可以通过&&运算符将这两个命令组合如下,如果当前命令成功执行并且只允许执行下一个命令,则此运算符还会维护其执行顺序:

 sudo -s && cd /var/lib 

要么

 sudo -s && cd /root 

如果你真的想让sudo cd directory工作,你可以定义一个名为sudobash shell函数,它以这种方式运行时运行一个新的root shell,否则只运行常规的sudo命令。

正如其他答案所示,大多数用户不想打扰这样做,但他们想要:

  1. 如果你想要一个登录shell,请运行sudo -ssudo -i (请记住, sudo -i一个效果是在root的主目录中启动),如果你想强制bash或者能够传递选项,请运行sudo bash到了shell。
  2. 在新shell中运行cd directory
  3. 执行需要在新shell中以root身份执行的任何(其他)操作。
  4. 完成后,运行exit新shell。 重要的是不要忘记这一点,因为你不想以root身份执行比你想要的更多的动作!

所以,如果你愿意,那么你可以编写一个shell函数(或一个脚本),当sudo跟着cd时执行前两个动作,否则只是正常运行sudo请不要用它来替代学习为什么 sudo cd没有成功 ,因为如果你不明白发生了什么,那么你可能会因为在一个新的shell中而感到困惑(你可能不会理解任何发生的错误消息)。

这是编写这样一个shell函数的一种方法,它也提醒你,你在一个新的shell中,并且你应该在完成后exit它。 (该提醒可能对任何技能级别的用户都有用,因为当没有-s-i或实际shell的名称作为参数运行sudo时,通常不习惯在新shell中。)

 # 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 . ~/sudo.bash 。 这在当前shell及其子shell中生效,但不在其他shell中生效。 出于同样的原因,像.bashrc这样的文件不可执行,请不要用chmod标记sudo.bash可执行文件。 这实际上是一个库,而不是一个独立的shell脚本。 如果您确实将它作为shell脚本运行,它将定义函数…但仅在运行脚本的shell中,而不是作为调用者。 (当然,你可以为此编写一个脚本,这恰好不是我在这里采用的方法。)

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

另请注意,上面显示的shell函数仍允许您将其他参数传递给sudo但这会阻止它专门处理cd 。 特别是不支持运行sudo -u user cd directory ,但是你可以扩展shell函数来支持这种情况。 也不是sudo -i cd directory 。 它创建的shell类似于sudo -s获得的shell。 代码实际上并不运行sudo -s ,而是使用sudo bash ,因此-c选项可以正常运行。 当你向它传递cd和一个目录参数时,它实际上会运行bash两次(否则为零次)。 当你运行sudo cd directory ,首先它会从你正在运行sudo函数的一个单独的bash shell中sudo并更改目录。 如果成功,它将使用您可以使用的新的交互式替换该bash shell。

这是一个shell函数如何自动“做正确的事情”的例子。 请注意, sudo ls -A /root行为正常。 只有当我尝试使用sudo尝试cd到一个目录时才会创建一个新的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身份validation您。 但你实际上不必自己运行sudo -k 。 因为shell函数只是真正的sudo命令的一个瘦包装器,所以您的凭据缓存和其他常见的sudo行为仍然可以正常工作。

虽然它运行良好并且有点整洁,但我承认用相同名称的函数遮蔽真正的sudo命令是非常奇怪的。 大多数用户可能只想执行sudo -scd directory本身的步骤。 但是,如果有人想要这个 – 并且也certificate它是可能的 – 那就是它。

至于su或不是su辩论,我认为这很愚蠢。 su反对Ubuntu的宗教,并不是不小心做的事情。 如果你是root用户, rm -rf *可以做什么真是太神奇了。 但是,如果您对命令行界面(CLI)感到满意并且要执行系统级任务,则没有理由不使用su 。 我使用了几个发行版,甚至没有人提到使用sudo 。 这只是你正在做什么样的工作以及你最熟悉哪种方法的问题。 我用两个。