使用ssh执行命令的权限问题

问题

今天在shell当中使用ssh批量执行任务的时候遇到了权限问题,明明已经执行了sudo然而在将输出结果保存到文件的时候总是提示permission deny,简单看了一下知道了原因特此记录一下。

分析

在shell当中执行了以下命令,此时会报错,我们看到这里已经调用了sudo,为什么仍然会报没有权限的错误呢?

1
2
ssh user@10.10.111.111 sudo grep $keywords oldfile > newfile
# user在当前目录下无写权限

经过对以下两个资料的阅读知道了答案

问题原因

经过梳理,我们把以上shell命令剖析一下:

  1. 本机ssh与远程主机10.10.111.111建立了远程连接
  2. 连接建立之后创建一个shell开始执行命令,注意此时登陆用户为user而非root
  3. 执行sudo 以root用户执行后面的命令重定向到newfile

分析到这里看似没有问题,文件是应该被写入的啦,可为什么sudo之后还是不行呢,因为在linux当中,重定向操作相当于是shell打开了一个文件,并将该文件的fd与shell执行命令fork出来的子进程的stdout进行拼接而最终实现的写入文件的效果,所以这里敲黑板了,我们使用 > 重定向到文件相当于是在当前的shell当中打开文件,而此时用户是user,所以写100个sudo都还是没权限的!

解决方法

那么,知道了问题的原因,相应的我们就能找到对应的方法来解决这个权限问题,上述链接里面也有说明,那就是用tee这个命令。如下。

1
2
ssh user@10.10.111.111 grep $keywords oldfile | sudo tee newfile > /dev/null
# 这里注意sudo的位置哦

这里我们从原来的三部变成了如下过程:

  1. 本机ssh与远程主机10.10.111.111建立了远程连接
  2. 连接建立之后创建一个shell开始执行命令,注意此时登陆用户为user而非root
  3. 执行grep获取文件内容并输出
  4. 输出内容经过管道传递给tee,此时的tee是以root用户运行的,我们成功打开了newfile文件并写入

最后

不得不说,linux当中权限的问题确实还是挺多的,如果说平时都是使用root来操作当然不会遇到这些问题,也错过了很多学习的机会,也容易造成比较大的错误,所以日常中还是使用普通账户比较好啦:)

转载请注明来源链接 http://just4fun.im/2018/04/23/shell-sudo-redirect-deny/ 尊重知识,谢谢:)