14

solaris Box でスクリプトを実行しています。具体的には SunOS 5.7 です。私はルートではありません。次のようなスクリプトを実行しようとしています。

newgrp thegroup << FOO
source .login_stuff
echo "hello world"
FOO

スクリプトが実行されます。問題は、ソース .login_stuff がソースされていない古いグループに私を置く呼び出しプロセスに戻ることです。私はこの行動を理解しています。私が探しているのは、サブシェルに留まる方法です。これで、スクリプトに xterm& (以下を参照) を入れることができることがわかりましたが、それはそれを実行しますが、新しい xterm を持つことは望ましくありません。

現在の pid をパラメーターとして渡します。

newgrp thegroup << FOO
source .login_stuff
xterm&
echo $1
kill -9 $1
FOO

利用できる sg がありません。また、newgrp が必要です。

4

8 に答える 8

20

以下はうまく機能します。(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 では問題なく動作します。1 つの注意点: スペースを含む引数は分割されます。env arg1='value 1' arg2='value 2' script.sh コンストラクトを使用してそれらを渡すことをお勧めします (何らかの理由で $@ で動作させることができませんでした)

于 2010-09-08T11:33:09.283 に答える
10

このnewgrpコマンドは、対話型シェル AFAICT からのみ有効に使用できます。実際、私はそれについてあきらめました...まあ、かなり前に、私が書いた代替品が英国と米国の両方で投票する資格があるとしましょう。

newgrpシェルに「組み込まれた」特別なコマンドであることに注意してください。厳密には、これはシェルの外部にあるコマンドですが、シェルにはその処理方法に関する知識が組み込まれています。シェルは実際にexecはプログラムなので、その後すぐに新しいシェルを取得します。また、setuid ルート プログラムでもあります。Solaris では、少なくとも、newgrpSHELL 環境変数も無視するようです。

newgrp対処することを意図した問題を回避するさまざまなプログラムがあります。このコマンドは、ユーザーが一度に複数のグループに所属できるようになる前からあることに注意してください (バージョン 7 の Unix マニュアルを参照してください)。またはとnewgrpは異なり、実行後にコマンドを実行するメカニズムを提供しないため、のようなsetuid ルート プログラムであり、あるグループから別のグループに切り替えることができるプログラムを作成しました。これはかなり単純です。main() と標準化されたエラー報告関数のセットを使用するだけです。ソースについては、私に連絡してください (最初のドットは gmail ドットコムで最後に)。' と呼ばれるはるかに危険なコマンドもあります。susudonewgidnewgrpasroot' これにより、ユーザーとグループのリストをより徹底的に微調整することができます (ただし、デフォルトのコンパイルでは私だけです)。

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 ルート プログラムをインストールする許可を取得するのは難しい場合があります。マルチグループ機能により、現在利用可能ないくつかの回避策があります。ファイルを作成したいディレクトリに setgid ビットを設定するのが有効なテクニックの 1 つです。これは、ファイルの作成者に関係なく、ファイルはディレクトリを所有するグループに属することを意味します。これにより、必要な効果が得られることがよくありますが、これを一貫して使用している人はほとんどいません。

于 2008-11-18T19:47:58.567 に答える
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
于 2011-12-02T22:37:22.197 に答える
6
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

注意してください -- 「$」を必ずスラッシュでエスケープしてください。他のグループとしてシェルを実行する前に一重引用符も展開するため、相互作用は少し奇妙です。したがって、プライマリ グループが「users」で、使用しようとしているグループが「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

..'i​​d -gn' は現在のシェルによって実行され、adm として実行されているシェルに送信されたためです。とにかく、私はこの投稿が古いことを知っていますが、これが誰かに役立つことを願っています.

于 2012-04-09T21:27:57.873 に答える
0

多分

exec $SHELL

トリックをしますか?

于 2008-11-18T19:01:35.307 に答える
0

xterm& の代わりに sh& (または使用したいシェル) を使用できます。

または、現在のシェルのコンテキストにとどまるように、エイリアスの使用を検討することもできます (シェルがこれをサポートしている場合)。

于 2008-11-18T19:26:17.550 に答える
0

tst.ksh などのスクリプト ファイルでは、次のようになります。

#! /bin/ksh
/bin/ksh -c "newgrp thegroup"

コマンドラインで:

>> groups fred
oldgroup
>> tst.ksh

>> groups fred
thegroup
于 2014-02-28T13:19:20.860 に答える
0
sudo su - [user-name] -c exit;

トリックを行う必要があります:)

于 2018-03-28T08:35:16.817 に答える