我在solaris Box上运行脚本。特别是SunOS 5.7。我不是根。我正在尝试执行类似于以下内容的脚本:
newgrp thegroup<< FOO
来源.login_粮
回声“你好世界”
FOO
脚本运行。问题是它返回到调用进程,该进程将我放入源组.login_stuff未被获取的旧组中。我理解这种行为。我正在寻找的是一种留在子壳中的方法。现在我知道我可以放一个xterm&在脚本中(见下文)并且会这样做,但是有一个新的xterm是不可取的。
将当前的pid作为参数传递。
newgrp thegroup<< FOO
来源.login_粮
的xterm&安培;
回声$ 1
杀了-9 $ 1
FOO
我没有可用的sg。 此外,newgrp是必要的。
答案 0 :(得分:17)
以下效果很好;将以下位置放在(Bourne或Bash)脚本的顶部:
### first become another group
group=admin
if [ $(id -gn) != $group ]; then
exec sg $group "$0 $*"
fi
### now continue with rest of the script
这在Linuxen上运行正常。一个警告:包含空格的参数被分开。我建议你用 env arg1 ='value 1'arg2 ='value 2'script.sh构造将它们传入(由于某种原因我无法使用$ @)
答案 1 :(得分:7)
newgrp
命令只能在交互式shell AFAICT中有意义地使用。事实上,我放弃了......好吧,我说很久以前我写的替代品现在有资格在英国和美国投票。
请注意newgrp
是一个特殊的命令'内置'到shell中。严格来说,它是shell外部的命令,但shell具有关于如何处理它的内置知识。 shell实际上是exec
的程序,所以你之后会立即得到一个新的shell。它也是一个setuid root程序。至少在Solaris上,newgrp
似乎也忽略了SHELL环境变量。
我有各种各样的程序可以解决newgrp
旨在解决的问题。请记住,该命令可以提前确定用户同时属于多个组的能力(请参阅Version 7 Unix Manuals)。由于newgrp
在执行命令后不提供执行命令的机制,因此与su
或sudo
不同,我编写了一个程序newgid
,与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位。这意味着无论谁创建文件,该文件都属于拥有该目录的组。这通常会达到您所需要的效果 - 尽管我知道很少有人一直使用它。
答案 2 :(得分:6)
这个例子是从plinjzaad的答案中扩展出来的;它处理一个命令行,其中包含带引号的带引号的参数。
#!/bin/bash
group=wg-sierra-admin
if [ $(id -gn) != $group ]
then
# Construct an array which quotes all the command-line parameters.
arr=("${@/#/\"}")
arr=("${arr[*]/%/\"}")
exec sg $group "$0 ${arr[@]}"
fi
### now continue with rest of the script
# This is a simple test to show that it works.
echo "group: $(id -gn)"
# Show all command line parameters.
for i in $(seq 1 $#)
do
eval echo "$i:\${$i}"
done
我用它来证明它有效。
% ./sg.test 'a b' 'c d e' f 'g h' 'i j k' 'l m' 'n o' p q r s t 'u v' 'w x y z'
group: wg-sierra-admin
1:a b
2:c d e
3:f
4:g h
5:i j k
6:l m
7:n o
8:p
9:q
10:r
11:s
12:t
13:u v
14:w x y z
答案 3 :(得分:4)
newgrp adm << ANYNAME
# You can do more lines than just this.
echo This is running as group \$(id -gn)
ANYNAME
..将输出:
This is running as group adm
小心 - 确保用斜杠逃避'$'。这种交互有点奇怪,因为在它作为另一个组执行shell之前,它甚至会扩展单引号。所以,如果您的主要群组是“用户”,而您尝试使用的群组是“adm”,那么:
newgrp adm << END
# You can do more lines than just this.
echo 'This is running as group $(id -gn)'
END
..将输出:
This is running as group users
..因为'id -gn'是由当前shell运行的,然后发送到以adm运行的那个。 无论如何,我知道这篇文章很古老,但希望这对某人有用。
答案 4 :(得分:0)
也许
exec $SHELL
可以做到这一点吗?
答案 5 :(得分:0)
你可以使用sh&amp; (或者你想要使用的任何shell)而不是xterm&amp;
或者你也可以考虑使用别名(如果你的shell支持这个),这样你就可以保留在当前shell的上下文中。
答案 6 :(得分:0)
在脚本文件中,例如tst.ksh:
#! /bin/ksh
/bin/ksh -c "newgrp thegroup"
在命令行:
>> groups fred
oldgroup
>> tst.ksh
>> groups fred
thegroup
答案 7 :(得分:0)
sudo su - [user-name] -c exit;
应该做的伎俩:)