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

Fab*_*ien 6 linux ssh sudo redirection permissions

阅读完这个问题后,我知道我必须这样做

sudo sh -c 'ls -hal /root/ > /root/test.out'
Run Code Online (Sandbox Code Playgroud)

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

但是当我这样做时

ssh hostname sudo sh -c 'ls -hal /root/ > /root/test.out'
Run Code Online (Sandbox Code Playgroud)

从另一台机器,我得到

bash: /root/test.out: Permission denied
Run Code Online (Sandbox Code Playgroud)

为什么?我怎样才能让它发挥作用?

编辑:有这条线

Defaults:<username>    !requiretty
Run Code Online (Sandbox Code Playgroud)

<username> ALL= NOPASSWD: ALL
Run Code Online (Sandbox Code Playgroud)

/etc/sudoers

我可以

ssh remote-machine 'sudo ls /'
Run Code Online (Sandbox Code Playgroud)

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

Gab*_*abe 7

问题在于引号是由本地 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消耗下一层-双引号-并呼吁sudosh-cls -hal /root/ > /root/test.out

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

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