为什么这个 sudo 命令尝试在 /root 中运行?

为什么这个 sudo 命令尝试在 /root 中运行?

我尝试通过 SSH 运行 sudo 命令,如下所示:

ssh domain.com sudo -u user bash -c "cd /home/user/ && ls"

(这显然只是一个例子)。

我回复说:

/home/user/: line 0: cd: /root: Permission denied

我想知道为什么 sudo 尝试改变为 /root?

答案1

在我看来,有两种方法可以解决这个问题:

  1. 重点是让您的命令在正确的目录中运行。为此,我建议-i使用 sudo 标志,它将设置一个环境,就像您以该用户身份登录一样,因此:

    ssh domain.com sudo -iu user ls
    
  2. 专注于解决引用问题,以便引用的命令仍然可以被视为 的一个参数bash,这样它将作为单个命令字符串执行。为此,在这种情况下,似乎你只需要再加一层引用,如下所示:

    ssh domain.com sudo -u user bash -c "'cd /home/user/ && ls'"
    

    或者:

    ssh domain.com sudo -u user bash -c '"cd /home/user/ && ls"'
    

    解释:调用 ssh 的 shell 占用一组引号,向 ssh 传递以下(使用上面的第一个示例)参数列表(如sshargv之后的):argv[0]

    1. domain.com
    2. sudo
    3. -u
    4. user
    5. bash
    6. -c
    7. 'cd /home/user && ls'

    这会导致 sudo 获取以下参数列表:

    1. -u
    2. user
    3. bash
    4. -c
    5. cd /home/user && ls

    然后 sudo 从中解析出自己的参数,然后将其余部分不加修改地交给 bash,这样 bash 就会接收到以下参数:

    1. -c
    2. cd /home/user && ls

    然后 bash 将其第二个参数作为命令字符串,就像它被输入到交互式 shell 中一样,然后它运行第一个命令(cd /home/user),并且(因为)如果第一个命令成功,则&&运行第二个命令( )。ls

坦率地说,我可能会选择第一个选项......但第二个选项也适用于您的简单示例,并且根据您实际问题的实际情况,可能更适合您,也可能不适合您。

答案2

好的,@Zoredache 的建议是最有帮助的:

当你发出

ssh domain.com sudo -u user bash -c "cd /home/user/ && ls"

从源主机开始,在目标主机上实际运行

sudo -u user bash -c cd /home/user/ && ls

也就是说

sudo -u user bash -c cd /root

因为不带参数的 cd 会进入主目录,在这种情况下,这不是 sudo 用户的主目录,而是发出 sudo 的用户(即 root)的主目录

解决方案是转义每个特殊字符,如下所示

sudo -u user bash -c \"cd /home/ \&\& ls\"

但我确信有更简单的方法,不是吗?

答案3

您有权限查看该/目录吗?

如果没有的话尝试一下这个:

ssh domain.com sudo -u user bash -c "cd ~ && ls"

如果是这样,请尝试运行此命令:

ssh domain.com sudo -u user bash -c "cd /home/user/ && ls && whoami && groups user"

相关内容