2008-11-18 11 views
9

से बाहर निकलती है, मैं एक सौर मंडल बॉक्स पर एक स्क्रिप्ट चला रहा हूं। विशेष रूप से सनोस 5.7। मैं जड़ नहीं हूँ। मैं एक स्क्रिप्ट निम्न के समान निष्पादित करने के लिए कोशिश कर रहा हूँ:आप स्क्रिप्ट में newgrp का उपयोग कैसे करते हैं, तब उस समूह में रहें जब स्क्रिप्ट

newgrp thegroup < < FOO
स्रोत
.login_stuff गूंज "हैलो दुनिया"
FOO

स्क्रिप्ट चलाता है। समस्या यह है कि यह कॉलिंग प्रक्रिया पर वापस आती है जो मुझे पुराने समूह में स्रोत के साथ रखती है .login_stuff को सोर्स नहीं किया जा रहा है। मैं इस व्यवहार को समझता हूं। मैं जो खोज रहा हूं वह सब शैल में रहने का एक तरीका है। अब मुझे पता है कि मैं स्क्रिप्ट में xterm & (नीचे देखें) डाल सकता हूं और यह ऐसा करेगा, लेकिन एक नया xterm होना अवांछनीय है।

पैरामीटर के रूप में अपने वर्तमान पिड को पास करना।

newgrp thegroup < < FOO
स्रोत .login_stuff
टर्म &
गूंज $ 1
मार -9 $ 1
FOO

मैं sg उपलब्ध नहीं है। इसके अलावा, newgrp आवश्यक है।

उत्तर

15

निम्नलिखित अच्छी तरह से काम करता है; (बॉर्न या बैश) स्क्रिप्ट के शीर्ष पर निम्न बिट डाल:

### 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 का उपयोग करने के लिए उन्हें (मुझे किसी कारण से $ @ के साथ काम नहीं मिल सका)

+0

मदद उद्धृत कर सकते हैं? जैसा कि exec sg nas_bio3 "$ @" –

+1

में नहीं है, मुझे नहीं पता कि लिनक्सन का जवाब कब स्वीकार किया गया था जब सोलारिस को टैग किया गया था। मैं एक ही स्थिति में हूं, और "एसजी" मेरे सोलारिस बॉक्स पर मौजूद नहीं है। – Jolta

0

शायद

exec $SHELL 

चाल करना होगा?

+0

काम नहीं करता है कि – Paul

+0

नहीं ... वह काम नहीं करता। –

0

आप टर्म &

के बजाय श & (या जो भी खोल आप उपयोग करना चाहते) इस्तेमाल कर सकते हैं या फिर आप भी एक उपनाम का उपयोग करने पर विचार कर सकता है (अपने खोल इस समर्थन करता है) ताकि आप संदर्भ में रहना होता था वर्तमान खोल का।

+0

नहीं ... यह काम नहीं करता है। –

7

newgrp कमांड केवल एक इंटरैक्टिव शैल, AFAICT से उपयोग किया जा सकता है। असल में, मैंने इसके बारे में छोड़ दिया ... अच्छा, चलो काफी समय पहले कहें कि मैंने जो प्रतिस्थापन लिखा है वह अब ब्रिटेन और यूएसए दोनों में वोट देने योग्य है।

ध्यान दें कि newgrp शैल में निर्मित एक विशेष कमांड है। कड़ाई से, यह एक कमांड है जो खोल के बाहर है, लेकिन खोल ने इसे संभालने के तरीके के बारे में ज्ञान में अंतर्निहित किया है। शैल वास्तव में exec प्रोग्राम है, इसलिए आपको तुरंत बाद एक नया खोल मिलता है। यह एक निश्चित रूट प्रोग्राम भी है। सोलारिस पर, कम से कम newgrp भी SHELL पर्यावरण चर को अनदेखा करता है।

मैं प्रोग्राम हैं जो मुद्दा यह है कि newgrp को संबोधित करना था आस-पास काम की एक किस्म है। याद रखें, कमांड उपयोगकर्ताओं को एक साथ कई समूहों से संबंधित होने की क्षमता को पूर्व-दिनांकित करता है (Version 7 Unix Manuals देखें)।चूंकि newgrp निष्पादित करने के बाद कमांड निष्पादित करने के लिए एक तंत्र प्रदान नहीं करता है, su या sudo के विपरीत, मैंने एक प्रोग्राम newgid लिखा है, जैसे newgrp, एक सेटयूड रूट प्रोग्राम है और आपको एक समूह से दूसरे समूह में स्विच करने की अनुमति देता है। यह काफी सरल है - केवल मुख्य() प्लस मानक मानकीकृत त्रुटि रिपोर्टिंग का एक सेट इस्तेमाल किया जाता है। स्रोत के लिए मुझसे संपर्क करें (जीमेल डॉट कॉम पर अंतिम बिंदु)। मेरे पास '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 

(इस कार्यक्रम बढ़ी: मैं इसे खरोंच से redoing रहे थे, मैं अलग विकल्प पत्र की आवश्यकता के बिना यूजर आईडी या उपयोगकर्ता नाम को स्वीकार करेंगे, समूह आईडी या समूह का नाम लिए डिट्टो।)

यह मुश्किल हो सकता है setuid रूट प्रोग्राम स्थापित करने के लिए अनुमति प्राप्त करने के लिए। बहु-समूह सुविधाओं के कारण अब कुछ कामकाज उपलब्ध हैं। एक तकनीक जो काम कर सकती है वह है निर्देशिकाओं पर सेटगिड बिट सेट करना जहां आप फाइलें बनाना चाहते हैं। इसका अर्थ यह है कि इस पर ध्यान दिए बिना कि फ़ाइल कौन बनाता है, फ़ाइल उस समूह से संबंधित होगी जो निर्देशिका का मालिक है। यह अक्सर आपको आवश्यक प्रभाव प्राप्त करता है - हालांकि मुझे उन लोगों के बारे में पता है जो लगातार इसका उपयोग करते हैं।

+0

मुझे लगता है कि यह काम करेगा। मैं आपको ईमेल करूंगा और आपको स्रोत के लिए पूछूंगा (या मेरा ईमेल [email protected] है) क्या मैं बिना किसी प्रतिबंध के स्रोत का उपयोग कर सकता हूं। मैं यह पूछता हूं क्योंकि यह वाणिज्यिक उपयोग के लिए है (हालांकि घर के उपयोग में) यह उत्तर छोड़कर उत्तर है। – Paul

+0

तेज जवाब! सोलारिस 10 का नयाग्रुप (1) (कम से कम) उपयोगकर्ता के खोल को सुरक्षित रखता है, और वास्तव में $ SHELL (मैंने OpenSolaris स्रोत की जांच की) की जांच की है। –

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 
2
newgrp adm << ANYNAME 
# You can do more lines than just this. 
echo This is running as group \$(id -gn) 
ANYNAME 

..will उत्पादन:

This is running as group adm 

सावधान रहें - सुनिश्चित करें कि आप एक स्लैश के साथ '$' से बचने के बनाओ। इंटरैक्शन थोड़ा अजीब हैं, क्योंकि यह दूसरे समूह के रूप में खोल को निष्पादित करने से पहले एकल-उद्धरण भी फैलाता है। हां, यदि आपकी प्राथमिक समूह 'उन' है, और समूह आप का उपयोग करने की कोशिश कर रहे हैं, 'ADM' है तो:

newgrp adm << END 
# You can do more lines than just this. 
echo 'This is running as group $(id -gn)' 
END 

..will उत्पादन:

This is running as group users 

..because ' id -gn 'को वर्तमान खोल से चलाया गया था, फिर उसे प्रवेश के रूप में भेजा गया था। वैसे भी, मुझे पता है कि यह पोस्ट प्राचीन है, लेकिन उम्मीद है कि यह किसी के लिए उपयोगी है।

0

एक स्क्रिप्ट फ़ाइल जैसे tst.ksh में:

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

कमांड लाइन पर:

>> groups fred 
oldgroup 
>> tst.ksh 

>> groups fred 
thegroup