【Linux】root和子用户都能执行的命令,sudo无法执行(已解决)

全流程帖子 https://ask.oceanbase.com/t/topic/35604437/7

1.问题

如题,在编译miniob的时候遇到如下错误

[mu@vm-cnt8:~/code/miniob]$ sudo bash build.sh init
build.sh init
HEAD is now at 5df3037d Merge branch 'release-2.1.12-stable-pull' into patches-2.1
build.sh: line 83: cmake: command not found
build.sh: line 91: cmake: command not found
build.sh: line 99: cmake: command not found
build.sh: line 107: cmake: command not found

根据字面意思,是cmake命令找不到,但是我的系统里面已经有了符合条件的环境;以下是gihub/miniob仓库中docs里面how_to_build.md的内容

MiniOB 需要使用:

  • cmake 版本 >= 3.13
  • gcc/clang gcc建议8.3以上,编译器需要支持c++20新标准
  • flex (2.5+), bison (3.7+) 用于生成词法语法分析代码

我使用的系统是centos8-steam的vmware虚拟机;当前使用的miniob的commit为

76221e46e66ef408771ce886aa0c586a09374b0d

以下是我的系统中各个依赖项的版本号,可以看到在子用户中,依赖项的所有命令都可以正常执行

[mu@vm-cnt8:~/code/miniob]$ gcc --version
gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-20)
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.[mu@vm-cnt8:~/code/miniob]$ cmake --version
cmake version 3.27.4CMake suite maintained and supported by Kitware (kitware.com/cmake).
[mu@vm-cnt8:~/code/miniob]$ flex --version
flex 2.6.1
[mu@vm-cnt8:~/code/miniob]$ bison --version
bison (GNU Bison) 3.8
Written by Robert Corbett and Richard Stallman.Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

在root中,也可以正常执行这些命令

[root@vm-cnt8:~]# cmake --version
cmake version 3.27.4CMake suite maintained and supported by Kitware (kitware.com/cmake).
[root@vm-cnt8:~]# flex --version
flex 2.6.1
[root@vm-cnt8:~]# bison --version
bison (GNU Bison) 3.8
Written by Robert Corbett and Richard Stallman.Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

但是sudo执行miniob的安装脚本的时候,却找不到cmake命令

2.debug过程

经过大佬的教学,知道了一个新的sudo用法:sudo -E

sudo -E 是继承当前用户的环境变量运行sudo后面的命令,否则环境变量会被清理掉;

但是在初次使用的时候,依旧无法成功编译miniob,也找不到cmake命令

[mu@vm-cnt8:~/code/miniob]$ sudo -E bash build.sh init
[sudo] password for mu: 
build.sh init
HEAD is now at 5df3037d Merge branch 'release-2.1.12-stable-pull' into patches-2.1
build.sh: line 83: cmake: command not found
build.sh: line 91: cmake: command not found
build.sh: line 99: cmake: command not found
build.sh: line 107: cmake: command not found[mu@vm-cnt8:~]$ sudo -E cmake --version
[sudo] password for mu: 
sudo: cmake: command not found

3.最终解决:PATH环境变量

最终的解决办法是我自己想出来的(大佬也回复了我这个解决方案)

当前在子用户使用 sudo -E是找不到cmake命令的。

[mu@vm-cnt8:~]$ sudo -E cmake --version
[sudo] password for mu: 
sudo: cmake: command not found

我的系统里面的PATH环境变量如下。

[mu@vm-cnt8:~]$ sudo env | grep PATH
PATH=/sbin:/bin:/usr/sbin:/usr/bin

而cmake的路径如下

[mu@vm-cnt8:~]$ type cmake
cmake is /usr/local/bin/cmake
[mu@vm-cnt8:~]$ whereis cmake
cmake: /usr/local/bin/cmake /usr/share/cmake

有没有可能,是因为cmake不在PATH环境变量里面,导致sudo的时候找不到命令呢?虽然在root和mu用户下都可以直接执行cmake。

于是我就去root里面执行了一下软连接

[root@vm-cnt8:~]# ls /usr/bin | grep cmake
[root@vm-cnt8:~]# ln -s /usr/local/bin/cmake /usr/bin/cmake
[root@vm-cnt8:~]# ll /usr/bin | grep cmake
lrwxrwxrwx. 1 root root          20 Sep  1 05:57 cmake -> /usr/local/bin/cmake

再来试试

$ sudo -E cmake --version
cmake version 3.27.4CMake suite maintained and supported by Kitware (kitware.com/cmake).

最后再来试试编译,应该是OK了,init成功执行,编译也通过了,没有报错

image-20230901181050840

感谢miniob社区大佬们的帮助!

4.结论

如果出现一个命令,root和子用户都可以执行,但是子用户中sudo却找不到此命令,可以尝试检查一下该命令所在路径是否与当前系统的PATH环境变量不符合!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/62604.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【2D/3D RRT* 算法】使用快速探索随机树进行最佳路径规划(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

哪些情况需要用到云渲染?原来云渲染有这么多好处!

当前,CG行业发展迅猛,云渲染已成为越来越多的设计师必不可少的工具。在许多情况下,云渲染都能发挥重要的作用。 情况1:项目时间紧急 在当今繁忙的设计行业中,许多设计师需要通宵加班才能完成繁琐的工作。然而&#xf…

使用selenium实现对页面元素的抓取

一、背景介绍 工作中有个需求是需要对某个页面进行监控,但由于要监控页面数据是异步加载的,因此很难从状态码和返回结果层面进行校验。于是乎想到了通过判断页面元素是否存在且显示内容是否正确来达到此目标。调研了一下发现selenium可以实现对这种动态…

跨境做独立站,如何低成本引流?

大家都知道,海外的消费习惯与国内不同,独立站一向是海外消费者的最喜欢的购物方式之一,这也吸引了许多跨境商家开设独立站。 独立站不同于其他的第三方平台,其他平台可以靠平台自身流量来获得转化,而独立站本身没有流…

Python分享之redis(3)

3、List 操作 redis中的List在在内存中按照一个name对应一个List来存储 lpush(name,values) # 在name对应的list中添加元素,每个新的元素都添加到列表的最左边 r.lpush("list_name",2) r.lpush("list_name",3,4,5)#保存在列表中的顺序为5&am…

【linux命令讲解大全】040. 文件操作:使用touch命令创建和更新文件

文章目录 touch补充说明语法选项参数示例 从零学 python touch 创建新的空文件或更新已存在文件的时间标签。 补充说明 touch命令具有两个功能: 更新已存在文件的时间标签为当前系统时间(默认方式),文件的数据保持不变。创建新…

Git结合Gitee的企业开发模拟

本系列有两篇文章: 一是另外一篇《快速使用Git完整开发》,主要说明了关于Git工具的基础使用,包含三板斧(git add、git commit、git push)、Git基本配置、版本回退、分支管理、公钥与私钥、远端仓库和远端分支、忽略文…

桌面端后台项目笔记

套用模板 vue-pure-admin 所用主要框架笔记 1. electron app const { app } require(electron) app.on(事件名, () > {} // 回调函数)常用事件 will-finish-launching 当应用程序完成基础的启动的时候触发ready:electron完成初始化时触发window-all-close…

基于深度学习的网络异常检测方法研究

摘要: 本文提出了一种基于深度学习的网络异常检测方法,旨在有效地识别网络中潜在的异常行为。通过利用深度学习算法,结合大规模网络流量数据的训练,我们实现了对复杂网络环境下的异常行为的准确检测与分类。实验结果表明&#xf…

css3有哪些新特性?(包含哪些模块)

css3有哪些新特性?包含哪些模块?以下是整理的21个css3新特性: 1.新增选择器 p:nth-child(n){color: rgba(255, 0, 0, 0.75)} 2.新增伪元素 ::before 和 ::after 3.弹性盒模型 display: flex; 4.多列布局 column-count: 5; 5.媒体查询 media (max-width:…

数据库约束

文章目录 1. 简介2. 代码演示3. 外键约束4. 外键删除和更新行为 1. 简介 概念:约束时作用于表中子段上的规则,用于限制存储在表中的shuju目的:保证数据库中数据的正确、有效性和完整性分类: 约束描述关键字非空约束限制该字段不…

什么是 TF-IDF 算法?

简单来说,向量空间模型就是希望把查询关键字和文档都表达成向量,然后利用向量之间的运算来进一步表达向量间的关系。比如,一个比较常用的运算就是计算查询关键字所对应的向量和文档所对应的向量之间的 “相关度”。 简单解释TF-IDF TF &…

【PHP】Swoole:一款强大的PHP网络编程工具

在科学计算领域,Swoole是一款功能强大的PHP扩展,它提供了高性能的网络通信和异步编程功能。Swoole不仅支持TCP、UDP、Unix Socket和HTTP等通信协议,还具有异步并发处理能力,使得PHP开发者能够轻松地构建高性能的网络应用程序。 1…

逻辑回归算法学习笔记

逻辑回归算法介绍: 逻辑回归是一种常用的分类算法,用于将数据分为两个类别。与线性回归不同,逻辑回归使用的是逻辑函数(sigmoid函数)将线性输出转换为概率值,并根据概率进行分类。在本学习笔记中&#xff0…

蒲公英路由器如何设置远程打印?

现如今,打印机已经是企业日常办公中必不可少的设备,无论何时何地,总有需要用到打印的地方,包括资料文件、统计报表等等。 但若人在外地或分公司,有文件急需通过总部的打印机进行打印时,由于不在同一物理网络…

ceph对象三元素data、xattr、omap

这里有一个ceph的原则,就是所有存储的不管是块设备、对象存储、文件存储最后都转化成了底层的对象object,这个object包含3个元素data,xattr,omap。data是保存对象的数据,xattr是保存对象的扩展属性,每个对象…

cortex-A7核LED灯实验--STM32MP157

实验目的:实现LED1 / LED2 / LED3三盏灯工作 一,分析电路图 1,思路 分析电路图可知: 网络编号 引脚编号 LED1 PE10 LED2 > PF10 LED3 > PE8 2,工作原理: 写1:LED灯亮&#xf…

Spring Cloud Alibaba-Sentinel规则

1 流控规则 流量控制,其原理是监控应用流量的QPS(每秒查询率) 或并发线程数等指标,当达到指定的阈值时 对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。 第1步: 点击簇点链路,我们就可以看到访…

linux shell函数和返回值

shell函数可以有返回值,但是只能返回0-255作为状态值,不能返回字符串,字符串可以通过其他方式传递给调用者 1.shell函数的return 小于255的值 ~/Desktop$ cat b.sh getLastSize() { size2 return $size }getLastSize lastSize$? echo &qu…

提升系统管理:监控和可观察性在DevOps中的作用

在不断发展的DevOps世界中,深入了解系统行为、诊断问题和提高整体性能的能力是首要任务之一。监控和可观察性是促进这一过程的两个关键概念,为系统的健康和性能提供了宝贵的可见性。虽然这些术语经常可以互换使用,但它们代表着理解和管理复杂…