सभी आदेशों को एक उपनाम के रूप में परिभाषित होने से रोकें


10

क्या सभी आदेशों को एक उपनाम के रूप में परिभाषित करने से रोकने का कोई तरीका है?

उदाहरण के लिए एक उपयोगकर्ता को rmअन्य नाम (उबंटू डिफ़ॉल्ट कमांड) को अन्य नाम के रूप में परिभाषित करने में सक्षम नहीं होना चाहिए ।


आप का क्या तात्पर्य है? क्या आप अपने आप को गलती से करने से रोकने के लिए "सॉफ्ट ब्लॉक" जैसी चीज़ की तलाश कर रहे हैं?
कोस

4
मुझे यकीन नहीं है कि ऐसा करने की बात क्या है, भले ही यह संभव था।
मुरु

4
इसके लिए क्या तर्क होगा? यह किसी उपयोगकर्ता को वास्तविक कमांड टाइप करने से नहीं रोकता है ... इसलिए मुझे किसी को भी उपनामों को अवरुद्ध करने की आवश्यकता नहीं है?
३५ पर रिनजविंड

2
जैसे मुरू और रिनविंड ने कहा, क्या बात है? उपनाम उन चीजों की तुलना में नहीं कर सकते हैं जो उपयोगकर्ता को पहले से ही करने की अनुमति है, उपनाम को रोकना उपयोगकर्ता के जीवन को कठिन बना देता है। इसके अलावा, जो भी समाधान होगा (उदाहरण के लिए अंतर्निहित को ओवरराइड करने के लिए एक उपनाम / फ़ंक्शन का उपयोग करना) मैं इसे उपयोगकर्ताओं द्वारा स्वयं को गैर-परिवहनीय बनाने का एक तरीका नहीं सोच सकता, जब तक कि उनके लॉकिंग द्वारा ~/.bashrc
कोस

सभी उपनामों को अवरुद्ध नहीं कर रहा है, केवल उसे / उसके नाम को डिफ़ॉल्ट आदेश नाम का उपयोग नहीं करने के लिए रोकें। मुझे पता है कि हम वास्तविक कमांड को चलाने के लिए एक ही तरह के उपनाम के साथ \ _ का उपयोग करके कई तरह से उपनामों से बच सकते हैं। वह सब है
isғsнιη

जवाबों:


24

ऐसा कोई तरीका नहीं है जिससे आप किसी उपयोगकर्ता को जो भी पसंद करते हैं, उसे परिभाषित करने से रोक सकते हैं। विचार करें:

  1. आप में उपनामों को अक्षम करते हैं /etc/bash.bashrc। उन्होंने इसे जहां भी चुना, सक्षम किया।
  2. आप हटाने सभी में उपनाम का उल्लेख है /etc/bash.bashrc, और सभी ~/.bashrcऔर ~/.bash_aliasesएक स्क्रिप्ट के माध्यम से। उन्होंने अपने उपनामों को दूसरी फाइल में डाल दिया और उसे स्रोत बना लिया।
  3. आप एक आदेश चलाते हैं जो PROMPT_COMMANDकुछ उपनामों को निष्क्रिय करता है। वे पुनर्परिभाषित या अपरिभाषित करते हैं PROMPT_COMMAND
  4. आप जाल DEBUGऔर अपरिभाषित उपनाम। वे जाल को हटाते हैं।
  5. आप रूट करने के लिए आह्वान पर sourced सभी फ़ाइलों को चाउ। वे दूसरी फ़ाइल का उपयोग करते हैं और इसे मैन्युअल रूप से पहली कमांड के रूप में चलाते हैं।
  6. आप निर्मितियों को अक्षम करते हैं unset, builtinऔर enable; एक समारोह बनाओalias ; declare -rf aliasफ़ंक्शन को संशोधित करने से उपयोगकर्ताओं को रोकने के लिए; और समारोह का निर्यात करें। वे /bin/bashसाथ चलते हैं --rcfileऔर --init-fileएक नया शेल शुरू करते हैं, जहां कहा जाता है कि निर्माण अब सक्षम हैं।
  7. ...

आप संकलित समय पर उपनामों को अक्षम कर सकते हैं, तो यह आपके ऊपर होगा कि आप अद्यतित रहें और सुनिश्चित करें कि आप अगले शेलशॉक से प्रभावित नहीं हैं। बेशक, उपयोगकर्ता अपना बैश बना सकते हैं।


4
हालांकि मुझे एक अजीब सा विचार आया: आप उर्फ ​​उर्फ: =)
रिनजविंड

4
और वे unalias alias
मुरु

4
@muru यकीन है, लेकिन आप भी कर सकते हैं उर्फ unalias: +
Rinzwind

8
@Rinzwind और वे चलाते हैं \unalias unalias
मुरु

10

टी एल; डॉ

एक उपयोगकर्ता को उपनाम बनाने से रोकने का एकमात्र तरीका उन्हें शेल प्रदान करना है जो अलियासिंग का समर्थन नहीं करता है। यह आमतौर पर एक एक्स / Y समस्या है, जहां एक्स वास्तव में एक खतरा मॉडल है कि नहीं बल्कि समस्या को हल करने की कोशिश कर रहा से उचित नियंत्रण या आर्किटेक्चर के साथ हल किया जाना चाहिए है कार्योत्तर के बाद एक उपयोगकर्ता एक साझा तंत्र पर एक खोल दिया जाता है।

नीचे, मैं एक तकनीकी रूप से सही उत्तर प्रदान करता हूं, साथ ही यह क्या होगा और क्या हल नहीं होगा पर कुछ मार्गदर्शन। मैं वैकल्पिक नियंत्रणों पर कुछ अतिरिक्त मार्गदर्शन भी प्रदान करता हूं।

बैश प्रतिबंधित शैल का उपयोग करना

आप उपयोगकर्ता के लॉगिन शेल के रूप में rbash असाइन करके बैश के प्रतिबंधित शेल का उपयोग कर सकते हैं । उदाहरण के लिए:

foo:x:2001:2001:restricted user:/home/foo:/bin/rbash

फिर आपको उपयोगकर्ता के लिए अन्य रूप से बनाए गए उपनामों को अक्षम करना होगा , अधिमानतः हर किसी के खोल को भी तोड़ने के बिना। एक उदाहरण के रूप में, आप निम्न फ़ाइल जैसे /etc/profile.d/rbash.sh में जोड़ सकते हैं :

# Limit effect to users in a specific UID range.
if ((UID >= 2000)) && ((UID < 3000)); then
    # Check shell options; disable alias builtins when shell is restricted.
    if [[ $- =~ r ]]; then
        enable -n alias
        enable -n unalias
    fi
fi

चेतावनियां

जब तक आपने उपयोगकर्ता को चेरोट जेल में नहीं रखा है या उन्हें संशोधित PATH प्रदान किया है जिसमें अन्य गोले तक पहुंच शामिल नहीं है, तो उपयोगकर्ता bashको संकेत पर टाइप करने और अप्रतिबंधित शेल प्राप्त करने से कुछ भी नहीं रोक रहा है।

इसके अलावा, डिज़ाइन द्वारा प्रतिबंधित शेल कई सामान्य गतिविधियों जैसे निर्देशिकाओं को बदलने से रोकता है:

$ cd /tmp
rbash: cd: restricted

लेकिन अन्य स्क्रिप्ट या कार्यक्रमों को ऐसा करने से PATH में नहीं रोकता है। इसका मतलब है कि आपको उपयोगकर्ता के वातावरण को सावधानीपूर्वक तैयार करना होगा, और विशेष रूप से आपको उन्हें अपने स्टार्टअप फ़ाइलों में पथ को संशोधित करने से रोकने की आवश्यकता है , क्योंकि भले ही rbash PATH को केवल पठन- पाठन के बाद ऐसा करता है।

बेहतर विकल्प

यहां तक ​​कि अगर आप rbash का उपयोग करते हैं, तो आपको नियंत्रण के व्यापक सेट के हिस्से के रूप में ऐसा करने की आवश्यकता है। कुछ उदाहरणों में शामिल हो सकते हैं:

  • रोकें गैर तकनीकी से उपयोगकर्ताओं को गलती से इस तरह के रूप में डिफ़ॉल्ट उपनाम प्रदान करके खतरनाक आदेशों लागू rm -i, mv -iऔर cp -iमें /etc/bash.bashrc फ़ाइल।

    • अपने मूल उदाहरण को देखते हुए, यह संभवतः सबसे समझदार समाधान है।
    • आप चाहें enable -n aliasतो इसके साथ गठबंधन कर सकते हैं ।
    • यह जानकार उपयोगकर्ताओं को उपनाम बदलने से नहीं रोकेगा, लेकिन गैर-तकनीकी उपयोगकर्ताओं को जो कुछ भी इसके बारे में बताता है, उसे करने से रोकने के लिए पर्याप्त हो सकता है।
  • फ़ाइलों और निर्देशिकाओं की सुरक्षा के लिए पारंपरिक यूनिक्स अनुमतियाँ या पॉसिक्स एसीएल।

  • लॉगिन जो एक एकल गैर-संवादात्मक आदेश निष्पादित करते हैं। उदाहरण के लिए:

    foo:x:2001:2001:run foo.sh:/home/foo:/usr/local/bin/foo.sh
  • प्रति-कुंजी SSH मजबूर कमांड का उपयोग करें। उदाहरण के लिए:

    # ~foo/.ssh/authorized_keys
    command="/usr/local/bin/foo.sh" [remainder of line]
  • सशर्त मिलान ब्लॉक के साथ OpenSSH ForceCommand विकल्प का उपयोग करें ।

  • अपने विशिष्ट उपयोग के मामले के लिए विशेष उपकरण जैसे गिटोलिट या स्कूप्ली डिज़ाइन का उपयोग करें।

  • चिरोट जेल का उपयोग करें ।

  • एक पृथक्कृत वातावरण प्रदान करने के लिए Xenization, OpenVZ, LXC, VMware, VirtualBox, या अन्य तकनीकों जैसे वर्चुअलाइजेशन का उपयोग करें।

एक बार जब आप अपने खतरे के मॉडल को सही ढंग से परिभाषित कर लेते हैं, तो आप अपने उपयोग के मामले के लिए सबसे उपयुक्त नियंत्रणों की पहचान कर सकते हैं। आप क्यों अलियासिंग को रोकना चाहते हैं (जैसे वास्तविक दुनिया की समस्या यह क्या हल करती है?) की अधिक सार्थक समझ के बिना, आप सबसे उपयुक्त नियंत्रणों का चयन नहीं कर सकते।


+1 सामान्य तौर पर, लेकिन एक्स / वाई समस्या के रूप में इसे वर्गीकृत करने के लिए भी विशेष रूप से।
जो

5

यह काफी निरर्थक प्रयास है, जैसा कि मुरू के जवाब से पता चलता है। लेकिन कुछ विकल्प हैं, लेकिन वे सही नहीं हैं।

bashमैनुअल के अनुसार , कार्य हमेशा उपनामों पर पूर्वता लेते हैं, इस प्रकार हम निम्नलिखित कार्य कर सकते हैं:

xieerqi@eagle:~$ function alias { echo "Aliases are no-no" ; }
xieerqi@eagle:~$ alias TEST='rm'
Aliases are no-no

आप फंक्शन की परिभाषा को सिस्टमवाइड में रख सकते हैं .bashrc, हालाँकि जैसा कि मुरू ने बताया, स्मार्ट उपयोगकर्ताओं को bashrcउदाहरण के लिए एक अलग फाइल सोर्सिंग करके एलियास प्राप्त करने का तरीका मिलेगा ।

मेरे द्वारा खेला गया एक और विचार enableअंतर्निहित है। aliasएक शेल बनाया गया है, और bashइसमें अच्छी enableकमांड है जो बिल्डिन को सक्षम या अक्षम करने की अनुमति देता है। उदाहरण के लिए, यहाँ मुझे अक्षम किया गया है alias

xieerqi@eagle:~$ enable -n alias
xieerqi@eagle:~$ alias
No command 'alias' found, did you mean:
 Command '0alias' from package 'zeroinstall-injector' (universe)
alias: command not found
xieerqi@eagle:~$ alias TEST='rm'
No command 'alias' found, did you mean:
 Command '0alias' from package 'zeroinstall-injector' (universe)
alias: command not found
xieerqi@eagle:~$ enable alias
xieerqi@eagle:~$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
xieerqi@eagle:~$ 

दोबारा, सिस्टमवाइड bashrcका उपयोग करना यहां एक विकल्प है।



@ Afshin.Hamedi खैर, एक डिफ़ॉल्ट कमांड क्या है? एक जो ubuntu के साथ आता है? इसका मतलब है कि आपके पास डिफ़ॉल्ट स्थापना के साथ आने वाले सभी कमांड (बाइनरी फाइलें) की एक सूची होनी चाहिए। फिर हर बार जब उपयोगकर्ता शेल को लोड करता है या किसी अन्य चीज़ को करने की कोशिश करता है rm, तो यह सूची की जांच करता है। यह देखते हुए कि सूचियां बहुत बड़ी होंगी, शुरू होने में लंबा समय लगेगा, आपके उपयोगकर्ता आपसे बहुत शिकायत करेंगे और सिस्टम एडमिन के रूप में आपसे नफरत करेंगे :)
Sergiy Kolodyazhnyy

यह आपके लिए एक मजेदार, भयानक सवाल है, मुझे यह पसंद है! सेलेक्टिव एलियासिंग अच्छा होगा। लेकिन मुझे संदेह है कि यह प्राप्त करने योग्य है, जब तक कि शेल डेवलपर्स इसे लागू करने की आवश्यकता न
पाएं

फंक्शन का आइडिया अच्छा था। यह निकटतम आया।
मुरु

0

आप एक फ़ंक्शन को परिभाषित कर सकते हैं, /etc/profileजिसे एक फ़ंक्शन कहा जाता है aliasजिसे आप चाहते हैं (शायद उपयोग कर रहे हैं type -p) (सभी "उबंटू डिफ़ॉल्ट कमांड" के $PATHबाद बिलियन alias, ब्यूट को कॉल करने से पहले "एक्जीक्यूटेबल इन " हैं) , जैसा कि अन्य ने बताया है, आपके उपयोगकर्ता प्राप्त कर सकते हैं। उस के आसपास। क्यों नहीं उपयोगकर्ताओं का एक अलग सेट मिलता है, या उन्हें शिक्षित करते हैं ("यह परिभाषित करना aliasकि एक कमांड को ओवरराइड करता है एक बहुत अच्छा तरीका है शूटिंग पैर में शूटिंग का है, और भ्रम पैदा करता है (जैसे, lsमेरे पासवर्ड के लिए संकेत क्यों करता है ?))।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.