我正在尝试在 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 ...
更为常见。