如何在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
相关产品推荐
相关产品推荐

