看完之后这个问题我知道我必须这样做
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
使用-c
和ls -hal /root/ > /root/test.out
- 调用实例(以 root 身份运行),并将该单个参数解析为普通命令行,评估重定向。
要观看所有这些内容,请在目标系统上尝试运行sudo strace -f -e execve -p $(cat /var/run/sshd.pid)
。