2

我最近从 Windows 更改为 ubuntu,并且在尝试重新创建我的 postgresql 数据库的权限时遇到了困难。

我的问题如下:我有一个将 csv 文件导入 postgresql 数据库的脚本。数据位于多个 csv 文件中,我正在使用 psycopg2 处理带有包装器的导入。

但是,用户权限存在问题。

要运行该文件,我需要手动更改每个 csv 文件的权限(可以批量执行),以便将“其他”权限设置为读取和写入。

这与我最初设置数据库的方式有关吗?如果是这样,我该如何纠正它。

澄清:

我想知道如何将我的数据库设置更改为不需要手动更改“其他”设置的权限以允许导入。

请求添加的脚本

import psycopg2 as psy
import sys

conn = psy.connect("dbname = 'name' host='localhost' user = 'postgres' password ='password')
curs = conn.cursor()
tablename = 'tabname'
filename  = 'filename'

Input = "COPY %s FROM %s WITH CSV HEADER" % (tablename, filename)
curs.copy_expert(Input, sys.stdin)

conn.commit()
curs.close()
conn.close()

然后它周围有一个包装器,可以简单地在文件和表之间移动

我知道它有效,但是,它需要我手动更改 csv 文件的权限,以便“其他人”可以读取和写入它们。

我想知道为什么会这样

4

2 回答 2

2

一种解决方法 - 替换copy_expertcopy_from

f = open(filename)
curs.copy_from(f, tablename, ...)

这样,您的脚本将读取 CSV 文件而不是服务器进程,因此无需调整权限。

于 2012-04-09T00:03:05.000 回答
1

Unix 系统强制执行文件系统权限。除非数据的权限允许访问,否则任何用户进程都不能访问其他用户拥有的数据。唯一不受这些约束的用户是root帐户;但是因为root非常root强大,除非绝对必要,否则您不应运行任何进程。

有几个选项,具体取决于您希望保留数据的限制程度:

  • 您可以使文件归postgres用户所有。这有点生硬,如果您还必须以用户身份定期使用 CSV 文件,这可能会变得很烦人。它与您当前的方法大致相同,但需要调用。(您不能在现代系统上泄露文件。)rootchown(1)

    这类似于find /path/to/top -type f -print0 | xargs -0 chown postgres

  • 您可以创建一个新组;将该组添加到 PostgreSQL 运行的补充组列表中,使该组成为文件的组所有者,并确保该组对这些文件具有读取权限。这可能非常简单,特别是如果所有文件都位于一个目录或一个层次结构中。(BSD 组行为可以巧妙地设置文件的组所有权。)

    这种方法需要几个步骤:

    • 使用groupadd(8)或类似的命令来添加组。
    • 修改 PostgreSQL 配置以将组添加到补充组列表。
    • find /path/to/top -print0 | xargs -0 chgrp group_name
    • 如果你想使用 BSD 组:
      • 阅读mount(8)手册页上有关该bsdgroups mount(8)选项的部分。
      • 根据需要将bsdgroups挂载选项添加到您的/etc/fstab文件中。
      • 重新挂载文件系统以包含bsdgroups挂载选项:mount -oremount,bsdgroups /path/to/mount/point
      • 在您的目录上设置setgid位:find /path/to/top -type d -print0 | xargs -0 chmod g+s
  • 您可以向系统上的每个用户授予对文件的读取权限。这需要使用数据信任计算机上的每个进程——如果计算机托管不相关的服务,例如 web、ftp、邮件、无关客户端或系统的数据库服务等,这可能不是一个好的决定。

    您可以修改创建CSV 文件umask(2)的程序的设置。创建文件时应用此掩码,并且大多数程序不会尝试覆盖该设置。大多数 shell 可以很容易地更改for 自身和所有子进程 - 尝试在用于创建 CSV 文件的 shell 中运行,看看会发生什么。(它关闭了group 和 other 的权限。除非 PostgreSQL 也更新了这些文件,否则您不需要该权限,但您只说您需要导入它们。)umask(2)umask(2)umask 0022writewrite

尝试选择最简单尊重最小特权原则的解决方案——尽可能少地授予系统上每个服务所需的权限,以限制不安全的程序或配置的潜在后果。

于 2012-04-08T23:11:02.907 回答