sudo使用相关

转载

   

1,sudo后面的命令包含管道符号 

  • 问题描述:执行命令_sudo rpm -qa | grep subversion | awk '{print $1}'| xargs rpm --nodeps -e_的时候报错,提示某个文件的锁无法打开。
  • 问题分析:用管道,&&这样的符号连接的命令在LINUX系统中被认为是多条指令,并不是一条指令。问题描述中的使用方式实际上只赋予了rpm -qa使用sudo权限,后面的grep,awk,xargs实际上都没有sudo权限,这是为何不能执行成功的原因。实际上rpm -qa,grep,awk的执行都不需要sudo权限,只是最后xargs rpm --nodeps -e这条命令需要删除rpm包的时候,才需要sudo权限。
  • 解决方法1:改变命令的执行方式为:rpm -qa | grep subversion | awk '{print $1}'| sudo xargs rpm --nodeps -e
  • 解决方法2:改变命令的执行方式为:sudo bash -c "rpm -qa | grep subversion | awk '{print $1}'| xargs rpm --nodeps -e"
  • 注意:我们的帐号使用原则不允许直接使用sudo -s,sudo bash,sudo su之类的命令直接切换到root shell 

2, sudo后面的命令包含重定向符号 

  • 问题描述:执行命令_sudo cat /dev/null > Filename_的时候报错,提示没有权限操作。
  • 问题分析:用重定向符号连接的命令时,重定向符号之前的sudo cat /dev/null命令被赋予了sudo权限,但整串命令在一起并没有权限操作">"后的文件。这是为何不能执行成功的原因。实际上cat /dev/null的执行不需要sudo权限,只是改写“Filename"这个文件才需要sudo权限。
  • 解决方法:改变命令的执行方式为:sudo bash -c "cat /dev/null > Filename"
  • 注意:我们的帐号使用原则不允许直接使用sudo -s,sudo bash,sudo su之类的命令直接切换到root shell 

3, 经过跳板机rz大文件失败 

* 问题描述:SecureCRT可以跟rz、sz命令结合方便的上下传文件,但经过跳板机之后直接rz、sz一个稍大的文件会在上传一部分后退出并显示一堆乱码,这是因为这中间有控制字符的原因。

*解决办法: 加参数-e忽略控制字符:rz -e和sz -e

4,脚本中使用$HOME变量

  • 问题描述:某些同事原来写的脚本中包含如下内容。
BIN_DIR=${HOME}/tools TAIR_BIN_DIR=${HOME}/tair_bin TAIR_SRC_DIR=${HOME}/tair_src

原来的使用习惯是:直接登录admin的shell运行这些脚本。改用个人帐号使用sudo -u admin example.sh运行之后,发现脚本中$HOME变量获取成个人帐号家目录。

  • 问题分析:
    • sudo执行命令的时候,默认使用个人帐号的家目录赋值给$HOME变量。比如张三执行 _sudo -u admin example.sh_得到的$HOME结果是 /home/zhangsan
    • 原因是sudo命令默认不会修改$HOME变量,如果希望改变sudo中$HOME变量,则需要增加-H参数: _sudo -u admin -H example.sh 举例如下:
[yuanqiao@tair004013 ~]$ cat example.sh #!/bin/sh BIN_DIR=${HOME}/tools echo 'BIN_DIR='$BIN_DIR [yuanqiao@tair004013 ~]$ sudo -u admin ./example.sh BIN_DIR=/home/yuanqiao/tools [yuanqiao@tair004013 ~]$ sudo -u admin -H ./example.sh BIN_DIR=/home/admin/tools
  • 解决方法:
    • 虽然sudo -H这个参数能解决脚本的这个问题,但并不推荐大家使用sudo的-H参数,因为执行脚本的时候并不一定知道脚本里面的变量是如何定义或获取的。
    • 希望还是从脚本的编写角度出发,对脚本作适当修改,减少对admin/root这样帐号环境变量的依赖。

猜你喜欢

转载自blog.csdn.net/u012871914/article/details/81982812