如何在sudo期间保留所有环境变量?

如何在sudo期间保留所有环境变量?

我正在尝试使用sudo -u postgres在容器内运行所有 postgresql 命令,并且我想继承sudo.

sudo我首先需要这样做,因为某些 postgres 无法以 root 身份运行:

root@473f05e08ea1:/# pg_ctl
pg_ctl: cannot be run as root

因此使用sudo -u postgres 正如这里所建议的。遇到的第一个问题是PATHsudo后env变量不同,找不到postgres命令:

root@473f05e08ea1:/# sudo -u postgres pg_ctl
sudo: pg_ctl: command not found

经过一番搜索后,可以使用-E选项继承PATH

root@473f05e08ea1:/# sudo -u postgres -E env "PATH=$PATH" pg_ctl
pg_ctl: no operation specified

这让我想知道:

有没有办法继承所有环境变量(包括PGDATAPGOPTIONSHOME)?还是我必须通过反复试验将它们一一继承?

有关的:

为什么通过 sudo 和 su 运行时 PATH 变量不同?

- 更新 -

的输出diff -u <(sudo -E env) <(env)是:

root@2f8a4b93e1da:/# diff -u <(sudo -E env) <(env)
--- /dev/fd/63  2023-03-18 20:36:44.898156660 +0000
+++ /dev/fd/62  2023-03-18 20:36:44.898156660 +0000
@@ -8,12 +8,5 @@
 TERM=xterm
 SHLVL=1
 PGDATA=/var/lib/postgresql/data
-PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
-_=/usr/bin/sudo
-LOGNAME=root
-USER=root
-SHELL=/bin/bash
-SUDO_COMMAND=/usr/bin/env
-SUDO_USER=root
-SUDO_UID=0
-SUDO_GID=0
+PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/postgresql/15/bin
+_=/usr/bin/env

答案1

你的第二个命令,

sudo -u postgres -E env "PATH=$PATH" pg_ctl 

正在正常运转。

您只是没有为该命令指定选项pg_ctl,如错误消息所示。

为了澄清这一点,如果您

su -l postgres

然后运行命令

/usr/lib/postgresql/15/bin/pg_ctl 

或者

su -l postgres 

进而

export PATH=/usr/lib/postgresql/15/bin:$PATH 

其次是

pg_ctl

由于同样的原因,你会得到同样的错误。

pg_ctl有关使用过程中可用选项的信息,请参阅手册页。

相关内容