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 并不能解决问题。
问题在于引号是由本地 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)
.