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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
原因
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
不过可以直接通过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
- 1
- 2
- 3
- 4
- 5
- 6
注意看第一行的选项 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
- 1
- 2
- 3
- 4
因此,sudo环境重置后,并不用去引用$var这个变量,而是直接echo aaa。
解决
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.
- 1
- 2
简单来说,就是加上-E选项后,用户可以在sudo执行时保留当前用户已存在的环境变量,不会被sudo重置,另外,如果用户对于指定的环境变量没有权限,则会报错。
$ sudo -E bash test.sh # 加上-E参数后就可以获取到变量 aaa
2. 修改sudo配置文件
在内部测试机器中,安全性要求不高,总是需要加上-E参数来执行脚本,这个安全设定也不是很方便,可以通过visudo命令来修改配置为保留原有的环境变量,具体修改如下
$sudo visudo
# Defaults env_reset # 注释掉原有配置
# Defaults env_keep=”…” # 注释掉指定的变量保持
- 1
- 2
- 3
Defaults !env_reset # 修改为不重置环境
3. 手动添加变量
手动在脚本中设置所需的变量,这样看起来比较麻烦,或者在执行sudo脚本前先将所需要的变量写入到要执行的脚本开头.
命令
对于自己安装的软件在sudo提示找不到的命令(没加sudo可以找到),在这个后面添加命令所在的路径
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
- 1
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin:自定义路径
sudo执行脚本找不到环境变量和命令的更多相关文章
- sudo执行脚本找不到环境变量
sudo执行脚本找不到变量 问题 当普通用户下,设置并export一个变量,然后利用sudo执行echo命令,能得到变量的值,但是如果把echo命令写入脚本,然后再sudo执行脚本,就找不到变量,未能 ...
- sudo执行脚本找不到环境变量解决方法
问题: 当普通用户下,设置并export一个变量,然后利用sudo执行echo命令,能得到变量的值,但是如果把echo命令写入脚本, 然后再sudo执行脚本,就找不到变量,未能获取到值. 原因 sud ...
- SSH登录远程主机执行脚本找不到环境变量
这是因为在Linux上,bash会有四种模式,根据不同的case,Linux会加载不同模式的bash.一般如果你自己直接登录主机,能看到环境变量,但是使用ssh 远程登录执行脚本就找不到环境变量,那么 ...
- 关于使用sudo找不到环境变量的问题
参考这里:https://www.cnblogs.com/zhongshiqiang/p/10839666.html 使用sudo -E 保留当前用户环境,这时就不会存在找不到环境变量的问题了.
- sudo如何保持当前用户的环境变量?
现象,我在/etc/profile里设置全局代理,然后使用命令 1.curl http://www.baidu.com 走代理 2.sudo curl http://www.baidu.com 并没 ...
- linux环境变量 export命令详解
由host $ export DVSDK="${HOME}/ti-dvsdk_dm368-evm_xx_xx_xx_xx"引发的问题 1.${HOME}:首先, HOME 是个变量 ...
- linux环境变量设置命令
1echo $ <变量名> //显示某个环境变量 2env // environment (环境) 的简写,列出来所有的环境变量 3set //显示所有本地定义的Shell ...
- sudo用户找不到环境变量 sudo找不到/usr/local/bin 下的执行文件,
出于安全方面的考虑,使用sudo执行命令将在一个最小化的环境中执行,环境变量都重置成默认状态. 所以PATH这个变量不包括用户自定义设置的内容,如找不到/usr/local/bin/下面的命令在sud ...
- 解决SSH远程执行命令找不到环境变量的问题
通过SSH执行远程主机的命令或脚本时,经常会出现找不到自定义环境变量的问题.但是,如果通过SSH登录远程主机,然后再执行相同的命令或脚本,那么此时执行又是成功的.两种相似的方法,得到的结果却截然不同, ...
随机推荐
- CSS学习总结2:CSS框模型
1.CSS框模型概述 CSS框模型规定了元素框处理元素内容.内边框.边框和外边框的方式. 元素框的最内部分是实际的内容,直接包围内容的是内边距.内边距呈现了元素的背景.内边距的边缘是边框.边框以外是外 ...
- hdu 5441 Travel (2015长春网赛)
http://acm.hdu.edu.cn/showproblem.php?pid=5441 题目大意是给一个n个城市(点)m条路线(边)的双向的路线图,每条路线有时间值(带权图),然后q个询问,每个 ...
- President's Office
President of Berland has a very vast office-room, where, apart from him, work his subordinates. Each ...
- iOS.CM5.CM4.CM2
增量数据计算接口: CC_MDx_Init CC_MDx_Update CC_MDx_Final 全量数据计算接口: CC_MDx
- (O)JS核心:call、apply和bind
1. var func=function(a,b,c){ console.log([a,b,c]); }; func.apply(null,[1,2,3]); //[1,2,3] func.call( ...
- Eclipse快捷键系列
查看Eclipse自定义的快捷键或者自己定义快捷键的方式 Window --> preference --> general --> Keys 在光标所在行之后插入一行,省去了将光标 ...
- [Chrome Headless + Python] 截长图 (Take Full-page Screenshot)
# -*- coding: utf-8 -*- import time import os from selenium import webdriver from selenium.webdriver ...
- Maximum Product Subarray LT152
Given an integer array nums, find the contiguous subarray within an array (containing at least one n ...
- install virtualenv
$ [sudo] pip install virtualenv $ mkdir ~/envs $ virtualenv ~/envs/lsbaws/ $ cd ~/envs/lsbaws/ $ ls ...
- mysql 5.7.10 下互为主备配置
mysql安装方法这里就不在介绍,网上有很多教程 环境介绍: A主机: win2008_x64+mysql5.7.10 64位,ip192.168.7.180 B主机: win2008_x64+mys ...