RedHat8如何让所有用户可使用sudo账号安装的应用
你之前配置别名不生效是三个核心问题导致的:一是别名仅对交互式Shell生效,脚本调用、服务启动等非交互场景完全不识别别名;二是如果应用安装在main_user的家目录下,其他用户默认没有家目录的访问、执行权限,就算配了路径也跑不起来;三是如果profile.d下的配置文件权限不足、环境变量作用域不对,其他用户登录时根本不会加载对应配置。
按以下步骤操作即可实现全用户可用:
1. 先迁移应用到全局可访问路径,修复基础权限
首先确认应用的实际安装路径:
# 将<app_name>替换为你实际的程序名称,例如myapp、python3 which <app_name>
如果返回的路径在/home/main_user/目录层级下,先将整个应用目录迁移到RedHat约定的全局第三方软件存放目录/opt/:
# 示例:如果应用存放在main_user家目录的apps文件夹下 sudo mv /home/main_user/apps/<your_app_folder> /opt/
给应用目录配置全局可读、可执行权限,注意不要随意给全局写权限,避免安全问题:
sudo chmod -R o+rX /opt/<your_app_folder> # 如果应用有需要写入数据、缓存的子目录,单独给对应目录配置权限即可,不要给整个应用目录开写
如果应用依赖的配置文件之前存放在main_user家目录下,要么迁移到全局配置目录/etc/下,要么给配置文件加全局可读权限,避免其他用户启动时读配置报错。
2. 配置全局可识别的程序路径,不要用别名做全局映射
推荐优先用软链接方案,不需要修改全局环境变量,适配所有Shell场景:
- 软链接方案(最稳定省事):将应用的可执行文件链接到系统默认全局PATH包含的
/usr/local/bin/目录下,所有用户直接输入程序名即可调用:sudo ln -s /opt/<your_app_folder>/bin/<app_exec_file> /usr/local/bin/
如果应用依赖同目录的大量库文件,软链接单个可执行文件无法正常运行,可以选择配置全局PATH:
- 全局PATH配置方案:编辑全局环境变量文件
/etc/environment,将应用的bin目录追加到PATH值中,这个配置对所有用户、所有Shell场景(包括非交互、非登录Shell)都生效,注意写这个文件不要加export命令:# 原有PATH值保留,在末尾追加你的应用bin目录路径即可 PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/<your_app_folder>/bin"
如果你之前在/etc/profile.d/all_user.sh里写过配置,记得给文件加全局可读权限,否则其他用户登录时不会加载这个脚本:
sudo chmod 644 /etc/profile.d/all_user.sh
注意:不要靠执行source命令让全局配置生效,source仅对当前执行命令的Shell会话生效,全局配置需要用户重新登录后才会加载。
3. 验证配置有效性
切换到普通用户账号做验证,不要在main_user账号下测试:
su - user1 # 检查路径是否能识别 which <app_name> # 检查程序是否能正常启动 <app_name> --version
特殊场景说明
如果你是用conda、nvm这类用户级版本管理器安装的程序(如Python、Node.js相关应用),不要直接把家目录下的版本管理器目录软链到全局,会出现大量权限嵌套、环境变量冲突问题,建议直接用sudo将对应版本管理器安装到/opt/全局路径下,再安装需要的依赖和应用。
内容的提问来源于stack exchange,提问作者shivam

