[Linux] Comandos que podem ser executados por root e subusuários, mas não podem ser executados por sudo (resolvido)

Postagem completa do processo https://ask.oceanbase.com/t/topic/35604437/7

1. Pergunta

Conforme mencionado, encontrei o seguinte erro ao compilar o 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

De acordo com o significado literal, o comando cmake não pode ser encontrado, mas meu sistema já possui um ambiente qualificado; a seguir está how_to_build.mdo conteúdo dos documentos no armazém gihub/miniob

MiniOB requer:

  • versão cmake >= 3.13
  • gcc/clang gcc recomenda 8.3 ou superior, o compilador precisa suportar o novo padrão c++20
  • flex (2.5+), bison (3.7+) para gerar código de análise léxica e sintática

O sistema que utilizo é a máquina virtual vmware do centos8-steam; o commit do miniob usado atualmente é

76221e46e66ef408771ce886aa0c586a09374b0d

A seguir estão os números de versão de cada dependência do meu sistema. Você pode ver que no subusuário todos os comandos das dependências podem ser executados normalmente.

[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.4

CMake 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.

No root, você também pode executar esses comandos normalmente

[root@vm-cnt8:~]# cmake --version
cmake version 3.27.4

CMake 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.

Mas quando o sudo executa o script de instalação do miniob, o comando cmake não pode ser encontrado.

2. processo de depuração

Após o ensinamento do chefe, aprendi um novo uso do sudo:sudo -E

sudo -EÉ para herdar as variáveis ​​de ambiente do usuário atual e executar o comando após sudo, caso contrário as variáveis ​​de ambiente serão limpas;

No entanto, ao usá-lo pela primeira vez, o miniob ainda não pode ser compilado com êxito e o comando cmake não pode ser encontrado.

[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. Solução final: variável de ambiente PATH

A solução final foi algo que eu mesmo inventei (o chefe também me respondeu com esta solução)

sudo -EAtualmente, o comando cmake não pode ser encontrado ao usar o subusuário .

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

As variáveis ​​de ambiente PATH em meu sistema são as seguintes.

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

O caminho do cmake é o seguinte

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

É possível que o comando não possa ser encontrado durante o sudo porque cmake não está na variável de ambiente PATH? Embora o cmake possa ser executado diretamente pelos usuários root e mu.

Então fui ao root e executei uma conexão suave.

[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

Tente novamente

$ sudo -E cmake --version
cmake version 3.27.4

CMake suite maintained and supported by Kitware (kitware.com/cmake).

Finalmente, tente compilar novamente. Deve estar OK. O Init foi executado com sucesso e a compilação passou sem erros.

imagem-20230901181050840

Obrigado aos líderes da comunidade miniob pela ajuda!

4. Conclusão

Se um comando aparecer, tanto o root quanto os subusuários podem executá-lo, mas o sudo no subusuário não consegue encontrar o comando. Você pode tentar verificar se o caminho onde o comando está localizado não corresponde à variável de ambiente PATH do atual sistema!

Acho que você gosta

Origin blog.csdn.net/muxuen/article/details/132631010
Recomendado
Clasificación