我正在尝试使用sudo -u postgres
在容器内运行所有 postgresql 命令,并且我想继承sudo
.
sudo
我首先需要这样做,因为某些 postgres 无法以 root 身份运行:
root@473f05e08ea1:/# pg_ctl
pg_ctl: cannot be run as root
因此使用sudo -u postgres
正如这里所建议的。遇到的第一个问题是PATH
sudo后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
这让我想知道:
有没有办法继承所有环境变量(包括PGDATA
、PGOPTIONS
等HOME
)?还是我必须通过反复试验将它们一一继承?
有关的:
为什么通过 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
有关使用过程中可用选项的信息,请参阅手册页。