【问题标题】:\copy permission denied while importing CSV to Postgres on Ubuntu在 Ubuntu 上将 CSV 导入 Postgres 时 \copy 权限被拒绝
【发布时间】:2015-08-13 22:20:32
【问题描述】:

我在 Ubuntu 14.04 上使用 Postgres,我一直在尝试将 csv 文件导入 Postgres 中名为“天气”的表中。我查看了问题Postgres ERROR: could not open file for reading: Permission denied 并尝试使用\copy 命令而不是常规副本,但我仍然得到相同的Permission Denied 错误。

我有点犹豫是否要为所有用户修改该目录的所有文件的所有权权限(如第一个答案中所建议的那样)。这是副本声明:

\copy weather from '/home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv' HEADER DELIMITER ',' CSV

这是终端的截图:

为什么\copy 在这里不起作用?

【问题讨论】:

    标签: postgresql csv ubuntu-14.04


    【解决方案1】:

    您肯定需要更改一些权限,因为 Postgres 无法读取您的文件。 Postgres 与您是不同的用户,因此如果您不授予它权限,它就无法读取您的文件。只有当您的设置是 而不是 postgres 是运行psql 命令的用户时,\copy 解决方案才有效。

    您始终可以制作文件的副本,将文件的权限分配给 Postgres 可以执行的目录中的用户 Postgres,然后删除该文件,或者您可以这样做:

    您必须更改的内容取决于此命令的输出(以 user1 身份运行):

    namei -l /home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv
    

    (如果尚未安装,您可能需要在运行此命令之前sudo apt-get install util-linux

    此命令将列出文件及其所有父目录的当前权限,以便我们找到解决方案。

    假设所有目录都有以“x”结尾的条目,如下所示:

    drwxr-xr-x user group filename
    drwxr-xr-x
    drwxr-xr-x
    -rw-------
    

    那么以下两种解决方案中的任何一种都可以。

    1. 如果您不想更改所有用户的权限并且您拥有 sudoer 权限,则可以这样做

      sudo chown /home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv postgresql
      

      但是,这种方法会撤销您对文件的访问权限,这可能是您不想要的。但是,在您完成导入文件后,您可以随时将文件 chown 回给您

      sudo chown /home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv user1
      
    2. 如果您不介意所有用户都阅读您的文件,那么您可以执行(作为 user1 并且没有 root 权限)

      chmod a+r /home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv
      

      我建议您执行此解决方案。它只会更改该文件的权限,以便您计算机上的所有用户都可以读取它。然而,尽管默认情况下,Linux 中的大多数目录都可以由任何人打开,但如果不是所有用户都对您的目录具有执行权限,这可能会不起作用。

      当然,一旦你读过文件,你总是可以再次限制权限

      chmod a-r /home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv
      

      如果这些解决方案都不适合您,请在上面第一个命令的输出中发表评论。

    【讨论】:

    • 看截图。用户正在以自己的用户身份运行\copy。无论如何为namei 命令+1,我已经使用Linux 15 年了,对此一无所知。
    • 感谢 +1,但他们将其作为 postgres 运行。见sudo -i -u postgres
    • 哎呀,你是对的,我是盲人。对不起。我恳求-ENOCOFFEE 在澳大利亚的早晨。
    • @user156213:感谢您的详细回答。我刚刚运行了namei 命令并获得了文件权限输出。看起来 Dropbox 文件夹不是以 x 结尾的。在此之后我仍然可以运行您提供的两种解决方案中的任何一种,还是应该改变一些东西?这是输出的屏幕截图:i.imgur.com/kQw0fNB.png 另外,我是这台计算机上唯一的用户(user1)。
    • @user156213:我设法通过终端通过add user 命令设置了一个新用户,具有管理员访问权限,这样我就不会遇到用户是 postgres 时发生的管理问题。但我不知道如何使用这个新用户而不是sudo -i -u postgres 连接到 Postgres。它是如何工作的?
    【解决方案2】:

    无权限由终端替代

    pg documentation at NOTES

    路径将被解释为相对于服务器进程的工作目录(通常是集群的数据目录),而不是客户端的工作目录。

    所以,一般来说,使用psql 或任何客户端,即使在本地服务器中,您也会遇到问题......而且,如果您正在为其他用户表达 COPY 命令,例如。在 Github README 中,读者会遇到问题...

    表达具有客户端权限的相对路径的唯一方法是使用STDIN

    当指定 STDIN 或 STDOUT 时,数据通过客户端和服务器之间的连接传输。

    作为remembered here:

    psql -h remotehost -d remote_mydb -U myuser -c \
       "copy mytable from STDIN with delimiter as ','" \
       < ./relative_path/file.csv
    

    【讨论】:

      【解决方案3】:

      您似乎正在尝试从其他人的主目录中读取文件。

      通常这是不可能的,或者是他们的主目录或其中的目录的权限所允许的。这与 PostgreSQL 无关;你会发现:

      cat /home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv
      

      产生同样的错误。

      如果您的安全要求允许,您可以更改该路径的权限。否则,只需将其复制到 /tmp 并从那里导入即可。

      【讨论】:

      • 但是cat 命令不会给我一个错误。这是输出的屏幕截图:i.imgur.com/R6JsNVh.png.. 我应该只使用cp 命令将 csv 文件复制到\tmp吗?
      • @Manish 那是因为你需要用户 postgres 运行 psql 而不是 cat。如果你以postgres 运行,它会。
      • /tmp 文件夹是否始终是可访问的文件夹?我已经尝试过了,但它不起作用..也许该文件夹放在其他地方或者我需要在配置文件中注册它?
      • @Vass /tmp 始终可供所有用户访问,但/tmp 中的文件和目录可能具有更严格的权限
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-14
      • 1970-01-01
      • 2016-04-10
      • 2018-07-15
      • 2017-02-02
      • 2019-06-05
      • 1970-01-01
      相关资源
      最近更新 更多