该newgrp
命令只能从交互式外壳 AFAICT 中有意义地使用。事实上,我放弃了关于......好吧,让我们说很久以前我写的替代品现在有资格在英国和美国投票。
请注意,这newgrp
是一个“内置”外壳的特殊命令。严格来说,它是 shell 外部的命令,但 shell 具有关于如何处理它的内置知识。shell 实际上exec
就是程序,所以之后你会立即得到一个新的 shell。它也是一个 setuid 根程序。至少在 Solaris 上,newgrp
似乎也忽略了 SHELL 环境变量。
我有各种各样的程序可以解决newgrp
想要解决的问题。请记住,该命令早于用户同时属于多个组的能力(请参阅第7 版 Unix 手册)。由于newgrp
不提供在执行命令后执行命令的机制,与su
or不同sudo
,我编写了一个程序newgid
,该程序与 or 一样newgrp
,是一个 setuid 根程序,允许您从一个组切换到另一个组。它相当简单——只需要 main() 加上一组标准化的错误报告函数。联系我(第一个点最后在 gmail dot com)获取来源。我还有一个更危险的命令,叫做 'asroot
' 这让我(但只有我 - 在默认编译下)可以更彻底地调整用户和组列表。
asroot: Configured for use by jleffler only
Usage: asroot [-hnpxzV] [<uid controls>] [<gid controls>] [-m umask] [--] command [arguments]
<uid controls> = [-u usr|-U uid] [-s euser|-S euid][-i user]
<gid controls> = [-C] [-g grp|-G gid] [-a grp][-A gid] [-r egrp|-R egid]
Use -h for more help
Option summary:
-a group Add auxilliary group (by name)
-A gid Add auxilliary group (by number)
-C Cancel all auxilliary groups
-g group Run with specified real GID (by name)
-G gid Run with specified real GID (by number)
-h Print this message and exit
-i Initialize UID and GIDs as if for user (by name or number)
-m umask Set umask to given value
-n Do not run program
-p Print privileges to be set
-r euser Run with specified effective UID (by name)
-R euid Run with specified effective UID (by number)
-s egroup Run with specified effective GID (by name)
-S egid Run with specified effective GID (by number)
-u user Run with specified real UID (by name)
-U uid Run with specified real UID (by number)
-V Print version and exit
-x Trace commands that are executed
-z Do not verify the UID/GID numbers
Mnemonic for effective UID/GID:
s is second letter of user;
r is second letter of group
(这个程序成长了:如果我从头开始重做,我会接受用户 ID 或用户名,而不需要不同的选项字母;组 ID 或组名也是如此。)
获得安装 setuid root 程序的权限可能很棘手。由于多组设施,现在有一些解决方法可用。一种可行的技术是在您希望创建文件的目录上设置 setgid 位。这意味着无论谁创建文件,该文件都将属于拥有该目录的组。这通常可以达到您需要的效果 - 尽管我知道很少有人一直使用它。