运行命令 sudo -u postgres createuser -d -R -S $USER 我收到消息无法将目录更改为“/home/odoo”:Ubuntu22 中的访问被拒绝

运行命令 sudo -u postgres createuser -d -R -S $USER 我收到消息无法将目录更改为“/home/odoo”:Ubuntu22 中的访问被拒绝

我正在尝试在 Ubuntu 22.04 上安装 postgresql,为此我运行以下命令

sudo apt install postgresql postgresql-client

然后(在下一个提示符中)执行以下操作

sudo -u postgres createuser -d -R -S $USER

我在终端中收到以下消息

无法将目录更改为“/home/odoo”:访问被拒绝

我也尝试过以下命令

sudo su -c "createuser -s $USER" postgres

并出现相同的访问被拒绝消息。需要注意的是用户创建正确

这应该是正确的操作吗?

我该如何解决?

是什么导致了该消息?

我应该忽略该消息吗?

添加:

我提出这个问题的主要原因是出于好奇和学习的欲望,而不是因为我只是想完成安装 postgresql 时要做的事情。让我更好地解释一下,我试图将安装 postgresql 作为设置开发环境过程的一部分。

当执行问题中描述的命令时,我得到了访问被拒绝消息,但我在问题中评论说,用户创建正确,并继续该过程,毫无问题地到达终点。

鉴于此解释,我想评论一下,我尝试了 @Raffa 在第二条评论中提到的选项,它不再显示访问被拒绝的消息,其他一切都保持正常。命令如下:

sudo --login -u postgres createuser -d -R -S $USER

此时我想知道是否是因为在安装 Ubuntu 时我将其设置为自动登录,即不要求我输入密码。我将再次安装而不设置此选项,然后重试。我会回来发布结果。

我要感谢社区愿意分享他们的知识。

答案1

当以另一个用户身份运行命令sudo -u ...或使用 命令字符串时su username -c "...",需要记住,除非指定了该选项,否则目标用户的预期登录环境(就好像该用户实际登录一样)不一定完全设置并可供该命令使用--login

您的命令似乎包含一个涉及将目录更改为目标用户主目录的过程(在这种情况下,即调用用户postgres),但是,由于它调用/调用的任何环境变量或环境依赖过程都会转换为您当前运行的用户odoo,因此它被拒绝访问,因此出现错误消息:

could not change directory to "/home/odoo": Access denied

因此,您需要像下面这样调用目标用户作为登录用户:

sudo --login -u postgres createuser -d -R -S $USER

或者像这样:

sudo su --login postgres -c "createuser -s $USER"

请看此演示:

$ whoami
ubuntu
$
$
$ echo ~
/home/ubuntu
$
$
$ sudo -u test pwd
/home/ubuntu
$
$
$ sudo --login -u test pwd
/home/test
$
$
$ sudo su test -c "pwd"
/home/ubuntu
$
$
$ sudo su --login test -c "pwd"
/home/test

注意当在命令字符串中传递参数/变量时... -c "...$var",如果命令字符串是双引号,则该参数将在当前运行用户的命令行上扩展为它的值,然后才传递给目标用户的环境,例如"...$var"

$ whoami
ubuntu
$
$
$ sudo su test -c "echo $USER"
ubuntu

并将按原样传递(不扩展),并且如果单引号的话可能会稍后扩展,'...$var'例如:

$ whoami
ubuntu
$
$
~$ sudo su test -c 'echo $USER'
test

sudo su ...还要注意,很少需要组合使用,因此使用sudo -u ...su user ...更为常见。

相关内容