我正在尝试在 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时我将其设置为自动登录,即不要求我输入密码。我将重新安装而不设置此选项,然后重试。我会回来并发布结果。
我要感谢社区愿意分享他们的知识。
当以另一个用户身份运行命令
sudo -u ...
或使用命令字符串时su username -c "..."
,您需要记住,目标用户的预期登录环境(就像该用户实际登录一样)不一定完全设置好并可用于该命令,除非选项--login
已指定。您的命令似乎包含一个涉及将目录更改为目标用户的主目录(在这种情况下,调用用户 ie
postgres
)的过程,但相反,因为它调用/调用的任何环境变量或依赖于环境的过程都会转换为您当前运行的用户 ieodoo
,它被拒绝访问,因此出现错误消息:因此,您需要将目标用户作为登录用户调用,如下所示:
或者像这样:
请看这个演示:
请注意,当在命令字符串中传递参数/变量时,例如,如果命令字符串是双引号的,则
... -c "...$var"
该参数将在当前运行用户下的命令行上扩展为其值,然后再传递到目标用户的环境"...$var"
:并将按原样传递(不扩展),如果单引号,则可能稍后扩展
'...$var'
:sudo su ...
另请注意,很少需要组合使用,因此使用sudo -u ...
或su user ...
更为常见。