记录在shell脚本中使用sudo echo x > 时,抛Permission denied错误

1.场景

在一个非root且带有sudo权限的用户,使用shell脚本(单独手工执行命令不会抛错,是成功的):会抛错

#!/bin/bash -x

DNS_SERVER=10.xx.xx.xx;
echo "Add DNS Server";
sudo chattr -i /etc/resolv.conf;
sudo echo "nameserver $DNS_SERVER" > /etc/resolv.conf;
sudo chattr +i /etc/resolv.conf

2.错误

[[email protected] WNE-2280FFD89A744E81]$ ./init-emr-env.sh
+ DNS_SERVER=10.xx.xx.xx
+ echo ‘Add DNS Server‘
 Add DNS Server
+ sudo chattr -i /etc/resolv.conf
+ sudo echo ‘nameserver 10.xxx.xx.xx‘
./init-emr-env.sh: line 7: /etc/resolv.conf: Permission denied
+ sudo chattr +i /etc/resolv.conf
+ echo ‘remove hive2.0‘

3.分析

在shell脚本中,bash 拒绝这么做,说是权限不够.

这是因为重定向符号 “>” 也是 bash 的命令。sudo 只是让 echo 命令具有了 root 权限,但是没有让 “>” 命令也具有root 权限,所以 bash 会认为这个命令没有写入信息的权限。

4.解决方法

echo "nameserver $DNS_SERVER" | sudo tee /etc/resolv.conf

利用管道和 tee 命令,该命令可以从标准输入中读入信息并将其写入标准输出或文件中,
具体用法如下:

echo a |sudo tee 1.txt
echo a |sudo tee -a 1.txt  #  -a 是追加的意思,等同于 >>

tee 命令很好用,它从管道接受信息,一边向屏幕输出,一边向文件写入。

原文地址:https://blog.51cto.com/14309075/2414028

时间: 2024-08-15 03:13:34

记录在shell脚本中使用sudo echo x > 时,抛Permission denied错误的相关文章

Oralce SQLPlus 以及shell脚本中spool输出到文件时的格式化输出

http://blog.csdn.net/gyanp/article/details/7903056 1) 格式调整有以下参数 set echo on/off                     是否显示脚本中的需要执行的命令 set feedback on/off               是否显示 select 结果之后返回多少行的提示set linesize n                          设置一行最多显示多少字符,之前就是因为 n 设得过大,导致行与行之间有空

避免 ‘sudo echo xxxx >’ 时候 出现 “permission denied”

?  ~ echo "/opt/nfs 10.10.10.*(rw,all_squash,sync)">>/etc/exports zsh: permission denied: /etc/exports 解决办法: 1)sudo sh -c ' echo "/opt/nfs 10.10.10.*(rw,all_squash,sync)" >> /etc/exports' 2)echo "/opt/nfs 10.10.10.*(rw

shell脚本中针对sudo等密码输入的问题解决方案

一.不希望手动输入的办法 1.安装expect工具:sudo apt-get install tcl tk expect 2.脚本文件内容如下: #! /usr/bin/expectspawn sudo apt-get updatesend "zhoushuo\r"interact 二.希望手动录入密码的方法: 1.脚本文件内容实例: #! /bin/bash sudo apt-get update<<EOF password EOF

Shell脚本中的并发(转)

转自http://blog.csdn.net/wangtaoking1/article/details/9838571 主要记录一下Shell脚本中的命令的并发和串行执行. 默认的情况下,Shell脚本中的命令是串行执行的,必须等到前一条命令执行完后才执行接下来的命令,但是如果我有一大批的的命令需要执行,而且互相又没有影响的情况下(有影响的话就比较复杂了),那么就要使用命令的并发执行了. 看下面的代码: #!/bin/bash for(( i = 0; i < ${count}; i++ ))

Shell脚本中的并发

主要记录一下Shell脚本中的命令的并发和串行执行. 默认的情况下,Shell脚本中的命令是串行执行的,必须等到前一条命令执行完后才执行接下来的命令,但是如果我有一大批的的命令需要执行,而且互相又没有影响的情况下(有影响的话就比较复杂了),那么就要使用命令的并发执行了. 看下面的代码: #!/bin/bash for(( i = 0; i < ${count}; i++ )) do commands1 done commands2 对于上面的代码,因为每个commands1都挺耗时的,所以打算使

shell脚本中echo显示内容带颜色

转自:http://www.cnblogs.com/lr-ting/archive/2013/02/28/2936792.html shell脚本中echo显示内容带颜色显示,echo显示带颜色,需要使用参数-e 格式如下: echo -e "\033[字背景颜色:文字颜色m字符串\033[0m" 例如: echo -e "\033[41;36m something here \033[0m" 其中41的位置代表底色, 36的位置是代表字的颜色 注:  1.字背景颜

让shell脚本中的echo输出带颜色

让echo输出带颜色的方法有两种 在shell脚本中定义颜色变量,使用echo -e调用变量 定义变量的时候,把echo -e定义到变量中,然后输出变量 可以让echo输出显示颜色的shell脚本 #!/bin/bash #定义颜色的变量 RED_COLOR='\E[1;31m'  #红 GREEN_COLOR='\E[1;32m' #绿 YELOW_COLOR='\E[1;33m' #黄 BLUE_COLOR='\E[1;34m'  #蓝 PINK='\E[1;35m'      #粉红 RE

shell脚本中echo显示内容带颜色显示

shell脚本中echo显示内容带颜色显示,echo显示带颜色,需要使用参数-e 格式如下: echo -e "\033[字背景颜色:文字颜色m字符串\033[0m" 例如:echo -e "\033[41;36m something here \033[0m" 其中41的位置代表底色, 36的位置是代表字的颜色 注: 1.字背景颜色和文字颜色之间是英文的"" 2.文字颜色后面有个m 3.字符串前后可以没有空格,如果有的话,输出也是同样有空格 下

shell脚本中使用echo显示带颜色的内容

shell脚本中使用echo显示带颜色的内容,需要使用参数-e 格式如下: echo -e "\033[字背景颜色;文字颜色m字符串\033[0m" 例如: echo -e "\033[41;36m Hello World \033[0m" 其中41的位置代表底色, 36的位置是代表字的颜色 注: 1.字背景颜色和文字颜色之间是英文的"" 2.文字颜色后面有个m 3.字符串前后可以没有空格,如果有的话,输出也是同样有空格 下面是相应的字和背景颜色