postgresql 使用sudo以其他用户身份运行时未找到命令

swvgeqrz  于 2022-11-23  发布在  PostgreSQL
关注(0)|答案(1)|浏览(388)

我正在尝试使用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,它看起来很好...

jogvjijk

jogvjijk1#

这是由于sudo配置具有“secure_path”设置。这会导致sudo将$PATH重置为硬编码的“已知安全”值。您的发行版可能启用了此功能。
当你运行sudo bash时,bash将读取它的设置,包括.bashrc,如果你在其中设置了$PATH,那么它当然会再次拥有那个$PATH。
但是,如果您运行一个命令而不通过重置$PATH的shell,您将获得硬编码的设置。
可以通过运行sudo visudo并更改以下行来更改该设置

Defaults secure_path="some:path:here"

Defaults !secure_path

另一种方法是通过完全限定路径运行命令,例如

sudo -u postgres (command -s psql)

关于您的测试的另一个注解:
sudo回显$PATH
这并不是你想要的。$PATH将被运行sudo的shell扩展,所以sudo只会看到它的值。这完全等同于运行sudo echo /home/opc/.local /home/opc/.local/bin /usr/pgsql-15/bin ...
您可能需要使用类似于

sudo env

sudo sh -c 'echo $PATH'

得双曲余切值.

相关问题