Golang如何让子进程以另一个用户身份运行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang如何让子进程以另一个用户身份运行相关的知识,希望对你有一定的参考价值。

参考技术A Golang如何让子进程以另一个用户身份运行

当父进程launch一个子进程的时候,如何使得子进程使用另一个用户身份运行。

前提条件当前用户得用足够的权限切换到另一个用户,所以通常父进程是root。

下面的例子是root用户的父进程,如何launch一个子进程,并且使得子进程以nobody的身份在运行(nobody是*nix操作系统的内置账号)。

其中关键的命令就是两行

先查找到nobody用户的uid和gid,然后调用syscall.Credential对象。

注意上述的操作都需要特权,通常只有root用户才有这个权限。

以另一个用户身份执行 Oracle 存储过程

【中文标题】以另一个用户身份执行 Oracle 存储过程【英文标题】:Executing an Oracle Stored Proc as Another User 【发布时间】:2011-01-23 12:23:14 【问题描述】:

我主要是预言机新手,如果这是一个愚蠢的问题,请原谅我......

我有一个名为“CODE”的架构,其中包含一个执行任意 SQL 的存储过程(现在,请忽略与此相关的潜在安全问题)。传入的 SQL 会选择数据;但所有数据都驻留在架构 A、B 或 C 中 - 但 SQL 一次只能从一个架构中进行选择。

例如:A 类型的用户创建一个字符串“SELECT * FROM A.USERTABLE” - 而 B 类型的用户创建一个字符串“SELECT * FROM B.USERTABLE”。

我想要做的是允许用户不明确指定他们的架构。在前端 .net 应用程序中;我已经知道它们是类型 A、B 还是 C。我希望所有三个都简单地输入“SELECT * FROM USERTABLE”。

我遇到的问题是我不知道该怎么做。我的应用程序只能在“CODE”架构中执行 proc - 所以我不能只是复制代码并让用户 A 调用“A.ExecuteSQL”。

我已经尝试了一些东西;但到目前为止没有任何效果。我希望 ExecuteSQL 过程保留在 CODE 模式中;但是当 'USERTABLE' 被传入时,我需要它知道有时这意味着 A.USERNAME,有时意味着 B.USERNAME。

有什么建议吗?

【问题讨论】:

【参考方案1】:

用途:

ALTER SESSION SET CURRENT_SCHEMA = schema

那是equivalent to SQL Server's EXECUTE AS syntax。

【讨论】:

这是如何工作的?第一个应用程序执行此ALTER 语句或在过程CODE 中执行此? asktom.oracle.com/pls/asktom/… 有更多信息。看起来您可以在存储过程中使用动态 sql(立即执行)来做到这一点。 @Guru:见 Rob P 的 AskTom 链接 感谢 OMG。它应该工作。我知道您需要在 PL/SQL 中使用 EXECUTE IMMEDIATE。但有人怀疑,当它开始执行并在中间更改为另一个模式时,这将如何变化。必须检查出来。【参考方案2】:

另一个选项是使用 AUTHID CURRENT_USER pragma。

如果您在包、过程、函数或类型名称之后立即添加这两个关键字,它将以执行用户的权限执行,而不是 CODE 模式。这会覆盖默认行为,即 AUTHID DEFINER(编译代码的架构/用户的权限)

CREATE FUNCTION examplefunc
    (pSqlStatement IN VARCHAR2)
RETURN INTEGER
  AUTHID CURRENT_USER
AS 
   lResult INTEGER;
BEGIN
    EXECUTE IMMEDIATE pSqlStatement INTO lResult;
    RETURN lResult;
END examplefunc;

请注意,对于包内的函数和过程,pragma 只能在包级别应用。您不能基于每个功能设置权限。

这应该会导致函数、包等中的任何 SQL 以用户权限执行。

我用它来管理类似的“动态运行任何旧的 SQL”例程 - 至少您将阻止“普通”用户使用您的存储过程删除表或安装CODE 架构中的附加代码。

(如果您还没有这样做,也可能值得 - 添加一些验证以丢弃某些关键字 - 即必须以 SELECT 开头,不得包含嵌入的 pl/sql 块 - 在不破坏现有的情况下您可以摆脱代码)。

【讨论】:

以上是关于Golang如何让子进程以另一个用户身份运行的主要内容,如果未能解决你的问题,请参考以下文章

如何关闭 Qt 子进程并让子进程执行清理代码?

以与长时间运行的 Python 进程不同的用户身份运行子进程

如何让子进程等待其兄弟?

如何在 Linux 中通过 C/C++ 以另一个用户身份创建文件?

Zombie进程

golang如何获取子进程的实时输出