linux sudo

30 篇文章 1 订阅

env

ubuntu20.2

概念

sudo, sudoedit : 用其它用户执行命令

sudo允许批准一个用户执行命令作为超级用户或其它用户, 由安全策略指定. 调用的用户ID被用来决定他拥有什么样的安全策略.

给用户添加sudo

	chmod +w /etc/sudoers
	vim /etc/sudoers
	chmod -w /etc/sudoers

sudo visudo

免密sudo,

xxxx   ALL=(ALL:ALL) NOPASSWD:ALL

nano保存并退出

Ctrl+X
Ctrl+T  # 选择要覆盖文件(sudoer) , 再回车

注意添加位置
在这里插入图片描述

Q & A

sudo执行脚本找不到环境变量

当普通用户下,设置并export一个变量,然后利用sudo执行echo命令,能得到变量的值,但是如果把echo命令写入脚本,然后再sudo执行脚本,就找不到变量,未能获取到值,如题情况如下:

$ cat tesh.sh 
echo $var 
$ var=aaa 
$ export var                       # export 变量 
$ sudo echo $var                   # sudo执行echo命令,返回变量值 
aaa 
$ sudo bash test.sh                # sudo执行脚本,不能获取变量值 
 
$ bash test.sh                     # 普通用户执行脚本,返回变量值 
aaa

原因
sudo运行时,会默认重置环境变量为安全的环境变量,也即,但前设置的变量都会失效,只有少数配置文件中指定的环境变量能保存下来。

sudo的配置文件是 /etc/sudoers 需要root权限才能读取:

$ sudo sed ‘/^#/d;/^$/d’ /etc/sudoers 
Defaults env_reset 
Defaults mail_badpass 
Defaults secure_path=”/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin” 
root ALL=(ALL:ALL) ALL 
%sudo ALL=(ALL:ALL) ALL 
xxx ALL=(ALL:ALL) NOPASSWD:ALL

不过可以直接通过sudo -l来查看sudo的限制:

$ sudo -l 
Matching Defaults entries for xxx on this host: 
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin 

User xxx may run the following commands on this host:
 (ALL : ALL) NOPASSWD: ALL

注意看第一行的选项Defaults env_reset表示默认会将环境变量重置,这样你定义的变量在sudo环境就会失效,获取不到。
另外有的发行版还有一个Defaults env_keep=""的选项,用于保留部分环境变量不被重置,需要保留的变量就写入双引号中。

为什么sudo echo $var能获取到变量值?

既然利用sudo执行会重置环境变量,那么为什么还能echo获取到相应的变量呢?
这是由于shell命令行的替换&重组功能,在输入命令,按下回车时,shell会先依据分隔符将命令行切割成字段,对每个字段查找有没有变量或命令替换,再替换完成后,重组成新的命令,再去执行。
所以,命令实际执行是:

$ sudo echo $var                   # $var => aaa 
(sudo echo aaa)                    # 完成命令替换&重组 
(echo aaa)                         # sudo环境中执行 
aaa

因此,sudo环境重置后,并不用去引用$var这个变量,而是直接echo aaa。

解决
1、sudo -E
-E选项在man page中的解释是:

-E

The -E (preserve environment) option indicates to the security policy that the user wishes to preserve their existing environment variables. The security policy may return an error if the -E option is specified and the user does not have permission to preserve the environment.

简单来说,就是加上-E选项后,用户可以在sudo执行时保留当前用户已存在的环境变量,不会被sudo重置,另外,如果用户对于指定的环境变量没有权限,则会报错。

$ sudo -E bash test.sh       # 加上-E参数后就可以获取到变量 
aaa

2、修改sudo配置文件
在内部测试机器中,安全性要求不高,总是需要加上-E参数来执行脚本,这个安全设定也不是很方便,可以通过visudo命令来修改配置为保留原有的环境变量,具体修改如下:

$sudo visudo 
# Defaults env_reset                  # 注释掉原有配置 
# Defaults env_keep=”…”               # 注释掉指定的变量保持 
Defaults !env_reset                   # 修改为不重置环境

3、手动添加变量
手动在脚本中设置所需的变量,这样看起来比较麻烦,或者在执行sudo脚本前先将所需要的变量写入到要执行的脚本开头。

sudo常见问题两例:免密码/保持环境变量

首先给一个很不错的sudo的文档!

https://wiki.archlinux.org/index.php/Sudo_%28%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%29

问题一:如何在使用sudo执行命令时免输入密码

在root下执行visudo
在文件尾部添加:

myuser ALL=(ALL) NOPASSWD: ALL
%mygroup ALL=(ALL) NOPASSWD: ALL

问题二:如休在使用sudo执行命令确保环境变量的传递

首先,我们可以随时使用sudo -u targetUser env来检查目标用户targetUser的环境变量,特别是你定义的一些HOME目录和PATH变量

以下是两个重要的配置步骤:

  1. 确保环境变量得以传递,以Hadoop相关的一些环境变量为例,我们需要在visudo中添加需要传递的环境变量,比如:

Defaults env_keep += “JAVA_HOME HADOOP_HOME HBASE_HOME HIVE_HOME MAHOUT_HOME PATH”

  1. 取保PATH变量得以传递:

上面env_keep配置的PATH变量实际并没有得到有效的传递,PATH变量会受到secure_path的约束,所引如果我们需要传递完整的path变量,我们需要修改secure_path!在visudo中它的默认值一般为:
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin

同样以hadoop环境为例,我们可以改为:

Defaults    secure_path = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/java/jdk1.7.0_71/bin:/usr/local/hadoop/bin:/usr/local/hadoop/sbin:/usr/local/hbase/bin:/usr/local/hive/bin:/usr/local/hive/hcatalog/bin:/usr/local/hive/hcatalog/sbin:/usr/local/mahout/bin

另:如果不做上述配置,可以使用sudo -i -u targetUser your-command来执行你的命令,使用-i参数会模拟一次登录,目标用户的相关环境变量就可以相应的被初始化了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大怀特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值