如果它具有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
工作,你可以定义一个名为sudo
的bash
shell函数,它以这种方式运行时运行一个新的root shell,否则只运行常规的sudo
命令。
正如其他答案所示,大多数用户不想打扰这样做,但他们想要:
- 如果你想要一个登录shell,请运行
sudo -s
或sudo -i
(请记住,sudo -i
一个效果是在root的主目录中启动),如果你想强制bash
或者能够传递选项,请运行sudo bash
到了shell。 - 在新shell中运行
cd directory
。 - 执行需要在新shell中以root身份执行的任何(其他)操作。
- 完成后,运行
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 -s
, cd directory
本身的步骤。 但是,如果有人想要这个 – 并且也certificate它是可能的 – 那就是它。
至于su
或不是su
辩论,我认为这很愚蠢。 su
反对Ubuntu的宗教,并不是不小心做的事情。 如果你是root用户, rm -rf *
可以做什么真是太神奇了。 但是,如果您对命令行界面(CLI)感到满意并且要执行系统级任务,则没有理由不使用su
。 我使用了几个发行版,甚至没有人提到使用sudo
。 这只是你正在做什么样的工作以及你最熟悉哪种方法的问题。 我用两个。