为什么通过 ssh、sudo 和 sh 时重定向会失败?

为什么通过 ssh、sudo 和 sh 时重定向会失败?

看完之后这个问题我知道我必须这样做

sudo sh -c 'ls -hal /root/ > /root/test.out'

以避免“权限被拒绝”错误。

但当我这样做

ssh hostname sudo sh -c 'ls -hal /root/ > /root/test.out'

从另一台机器上,我得到

bash: /root/test.out: Permission denied

为什么?我该如何让它发挥作用?

编辑:有这样一条线

Defaults:<username>    !requiretty

<username> ALL= NOPASSWD: ALL

/etc/sudoers

我可以

ssh remote-machine 'sudo ls /'

没有任何问题。所以我不认为这是 tty 的问题。添加 -t 并不能解决问题。

答案1

问题在于引号是由本地 shell 而不是远程 shell 解释和删除的;您需要一个额外的级别:

ssh host sudo sh -c '"ls -hal /root/ > /root/test.out"'

本地 shell 将消耗一级引用 - 单引号在这里被“用完”,ssh 将获取参数host, sudo, sh,-c"ls -hal /root/ > /root/test.out"

远程 shell 使用下一层 - 双引号 - 并sudo使用sh-c和进行调用ls -hal /root/ > /root/test.out

最后,sh使用-cls -hal /root/ > /root/test.out- 调用实例(以 root 身份运行),并将该单个参数解析为普通命令行,评估重定向。

要观看所有这些内容,请在目标系统上尝试运行sudo strace -f -e execve -p $(cat /var/run/sshd.pid)

相关内容