我正在尝试使用postgres
运行psql
。当我在新会话中运行sudo su - postgres
然后运行psql
时,它运行得很顺利。实际上,使用postgres
的那个会话中的~/.bashrc
具有正确的PATH
。
然而,如果我运行sudo -u postgres psql
,我得到的是sudo: psql: command not found
。即使我运行此命令的会话(我使用FISH shell)也有正确的PATH,我也可以在没有完整路径的情况下调用psql
。
我需要以sudo -u postgres psql
的形式调用命令,如何解释这种行为?
编辑:如果(从FISH)我切换到BASH并运行sudo -u postgres psql
,它就能工作!我猜这和FISH路径有关,那么...
编辑2:问题似乎是在使用sudo
时PATH被重置。
➜ ~ psql
psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: FATAL: role "opc" does not exist
➜ ~ sudo -u postgres psql
sudo: psql: command not found
➜ ~ echo $PATH
/home/opc/.local /home/opc/.local/bin /usr/pgsql-15/bin /usr/pgsql-15/bin /usr/local/bin /usr/bin /usr/local/sbin /usr/sbin
➜ ~ sudo echo $PATH
/home/opc/.local /home/opc/.local/bin /usr/pgsql-15/bin /usr/pgsql-15/bin /usr/local/bin /usr/bin /usr/local/sbin /usr/sbin
➜ ~ sudo -u postgres /usr/pgsql-15/bin/psql
could not change directory to "/home/opc": Permission denied
psql (15.1)
Type "help" for help.
postgres=#
但是如果我用sudo回显$PATH,它看起来很好...
1条答案
按热度按时间jogvjijk1#
这是由于
sudo
配置具有“secure_path”设置。这会导致sudo将$PATH重置为硬编码的“已知安全”值。您的发行版可能启用了此功能。当你运行
sudo bash
时,bash将读取它的设置,包括.bashrc,如果你在其中设置了$PATH,那么它当然会再次拥有那个$PATH。但是,如果您运行一个命令而不通过重置$PATH的shell,您将获得硬编码的设置。
可以通过运行
sudo visudo
并更改以下行来更改该设置至
另一种方法是通过完全限定路径运行命令,例如
关于您的测试的另一个注解:
sudo回显$PATH
这并不是你想要的。$PATH将被运行sudo的shell扩展,所以sudo只会看到它的值。这完全等同于运行
sudo echo /home/opc/.local /home/opc/.local/bin /usr/pgsql-15/bin ...
。您可能需要使用类似于
或
得双曲余切值.