我尝试通过 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
在我看来,有两种方法可以解决这个问题:
重点是让您的命令在正确的目录中运行。为此,我建议
-i
使用 sudo 标志,它将设置一个环境,就像您以该用户身份登录一样,因此:ssh domain.com sudo -iu user ls
专注于解决引用问题,以便引用的命令仍然可以被视为 的一个参数
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 传递以下(使用上面的第一个示例)参数列表(如ssh
argv
之后的):argv[0]
domain.com
sudo
-u
user
bash
-c
'cd /home/user && ls'
这会导致 sudo 获取以下参数列表:
-u
user
bash
-c
cd /home/user && ls
然后 sudo 从中解析出自己的参数,然后将其余部分不加修改地交给 bash,这样 bash 就会接收到以下参数:
-c
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"