【发布时间】:2019-05-19 16:34:43
【问题描述】:
Perl6 如何以不同的用户身份运行命令?
上下文:zef module manager 以普通用户身份安装,有些命令需要以 root 身份运行。
临时解决方案:以下功能允许以不同用户身份运行 shell 命令:
unit module Repo::Utils::RunAsUser;
sub RunAsUser( Str $user, Str $command, --> Proc ) is export {
return shell "su -c \'$command\' $user";
}
问题:
- 是否有其他语法可以从 Perl6 脚本以 root 身份运行命令?
- 用户能否以 root 身份运行某些 IO::Path 方法和子例程(如 unlink 或 mkdir)?
谢谢!
【问题讨论】:
-
我认为没有。要么使用 shell,要么使用对 Posix 函数的 Native 调用,它们的作用几乎相同。不过,我不知道这样的事情是否已经发表。我刚刚发现了这个:modules.perl6.org/dist/IO::Path::Mode:cpan:JSTOWE 这可能对这种事情有用。
-
让我们假设有像
run-as-root这样的函数——现在任何人都可以发布一个模块,以在安装该模块的任何人的系统上以root 身份执行任何操作。这忽略了run-as-root也需要一种方法来处理的事实,例如窗户。 -
@ugexe:你是对的!同时,假设模块 A 需要以 root 身份运行,而模块 A 使用模块 B、C 和 D。要运行模块 A,zef 必须以 root 身份安装,所有其他模块将以 root 身份运行。拥有以 root 身份运行的功能(如示例)可确保只有某些代码以 root 身份运行。
-
@ugexe:AppleScript 有一个方便的 with administratorprivilege 子句,可以标记到 shell 命令上:
do shell script 'rm important-file.foo' with administrator privileges,类似于shell 'rm important-file.foo' :elevated(将nix *root 和 Windows Administrator 通用)。在 AS 中,每次运行脚本都会触发管理员密码提示,错误的密码会导致脚本失败。在 P6 中复制(对于内置或模块)可能不是一个糟糕的模型,并且至少需要用户对模块进行干预。 -
理想情况下不会有脱壳期。特别是对于删除/修改目录。而且由于大多数其他使用 shell 的东西也有替代方案(例如 Prove vs TAP.pm6),我看不出它如何以稳健的方式工作。