You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PostgreSQL中获取Linux用户ID?(RHEL6与PG 9.6.7环境)

获取发起PostgreSQL连接的Linux用户ID

要获取发起PostgreSQL连接的Linux系统用户ID(UID)(而非PostgreSQL数据库用户),可以根据连接类型和环境采用以下方法,针对你提到的RHEL6 + PostgreSQL 9.6.7环境完全适用:

方法一:通过后台进程PID查询系统UID

PostgreSQL的每个会话都对应一个后台进程,我们可以先获取这个进程的PID,再通过Linux系统工具查询该进程对应的登录用户UID。

步骤1:在PostgreSQL会话中获取后台进程PID

执行以下SQL语句获取当前会话的后台进程ID:

SELECT pg_backend_pid();

步骤2:在Linux系统中查询对应UID

拿到PID后,在RHEL6的终端执行以下命令之一:

  • 方法A(推荐,获取登录用户UID,不受setuid影响):
cat /proc/<PID>/loginuid
  • 方法B(获取进程的有效UID):
ps -o uid= -p <PID> | tr -d ' '

方法二:在PostgreSQL内部创建自定义函数直接返回UID

如果你需要在PostgreSQL内部直接获取UID,可以创建一个自定义PL/pgSQL函数,调用系统命令读取进程的UID信息。注意:此方法需要超级用户权限,且要谨慎使用安全定义器模式。

创建函数示例

CREATE OR REPLACE FUNCTION get_linux_login_uid() RETURNS integer AS $$
DECLARE
    pid integer := pg_backend_pid();
    uid_str text;
    uid integer;
BEGIN
    -- 创建临时表存储UID结果
    CREATE TEMP TABLE IF NOT EXISTS tmp_uid (uid text);
    -- 调用系统命令读取loginuid并写入临时表
    COPY tmp_uid FROM PROGRAM format('cat /proc/%s/loginuid', pid);
    -- 读取并转换为整数类型
    SELECT trim(uid) INTO uid_str FROM tmp_uid;
    DROP TABLE tmp_uid;
    RETURN uid_str::integer;
EXCEPTION
    WHEN OTHERS THEN
        RETURN NULL; -- 若出现错误(如远程连接、权限不足)返回NULL
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;

使用函数

执行以下SQL即可获取当前会话对应的Linux登录用户UID:

SELECT get_linux_login_uid();

重要说明

  • 仅适用于本地Unix Socket连接:如果是远程TCP/IP连接,PostgreSQL无法获取客户端的Linux用户ID,因为TCP连接仅能提供客户端IP地址,无法穿透到对方系统的用户信息。
  • 权限限制:自定义函数需要超级用户权限才能执行系统命令,且SECURITY DEFINER模式需谨慎使用,避免权限泄露。
  • RHEL6兼容性:/proc/<PID>/loginuid在RHEL6环境下是可靠的,因为系统默认通过PAM设置了登录用户的UID标识。

内容的提问来源于stack exchange,提问作者daveg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:59:34