我正在为编程训练营做准备,并按照某些说明安装 Linux(Ubuntu v22.04)。安装进行得很顺利,但随后我被告知在终端中输入以下命令:
sudo apt-get update && sudo apt-get upgrade && sudo apt-get install git && sudo apt-get install curl postgresql postgresql-contrib && touch ~/.bash_profile && curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash && source ~/.nvm/nvm.sh && nvm install node && nvm use node && sudo -u postgres createuser --superuser $USER && sudo -u postgres createdb $USER && git config --global credential.helper store
据我了解,这是安装 Git、NVM、Node 和 Postgresql,并且似乎前三个安装正确,但是最后几行如下:
Now using node v20.4.0 (npm v9.7.2)
could not change directory to "/home/user": Permission denied
could not change directory to "/home/user": Permission denied
我认为这与 postgresql 有关,但我完全不知道这是否是个问题。我遵循的指南对此没有任何说明,这是我第一次使用任何类型的 Linux,所以我不熟悉这些术语。
如有必要,将不胜感激任何建议/解释。
答案1
总结:这不是问题,安装成功。有关于这个问题的讨论在 Postgres 邮件列表中已在 PostgreSQL 16 中修复。
错误原因:
这
could not change directory to "/home/user": Permission denied
错误来自这两个命令:
sudo -u postgres createuser --superuser $USER && sudo -u postgres createdb $USER
即使您收到“权限被拒绝”消息,命令仍已成功执行。
这些错误源于resolve_symlinks()
功能它使用解析符号链接chdir
,并最终尝试chdir
返回原始目录,如果执行用户psql
没有权限,则失败。resolve_symlinks()
调用来自,find_my_exec()
而调用者依次是set_pglocale_pgservice()
(设置PGSYSCONFDIR
和PGLOCALEDIR
)。
针对旧版本的解决方案:
对于 16 之前的版本,通过授予用户执行psql
/ createuser
/createdb
等命令x
对发出命令的工作目录的权限来修复错误。这可以通过几种方式完成:
添加
-i
到sudo
命令以使用登录 shell,它在执行命令之前将工作目录更改为 postgres 用户的主目录psql
(postgres 用户自然具有x
其自己主目录的权限):sudo -i -u postgres psql < setup_dev_db.sql
通过将postgres 用户
x
添加到拥有工作目录的组来授予其对当前工作目录的权限:# Get group owning the current directory stat -c "%G" . # Add postgres user to that group sudo usermod -aG <group above here> postgres
通过向“其他人”授予工作目录的权限,向 postgres 用户授予
x
当前工作目录的权限x
。这在用于开发的基于 VM 的单用户系统中非常方便,例如 WSL2,其中简单的chmod o+x /home/$USER
命令就可以修复错误。使用当前用户运行
psql
,该用户当然具有当前工作目录的权限。执行命令之前,将工作目录更改为 postgres 用户具有
x
权限的目录,例如cd /tmp
。
答案2
步骤1:
stat -c "%G" <the problem folder, e.g. `/home/user`>
第2步:
sudo usermod -aG <the output from the step 1> postgres
结果: