गैर-रूट उपयोगकर्ता द्वारा प्रदान किए गए शेल का उपयोग करें


0

गैर-रूट उपयोगकर्ता के लिए निष्पादन योग्य का उपयोग करने का एक अच्छा तरीका क्या है जो सिस्टम की शेल की सूची में नहीं है जैसे कि वह उपयोगकर्ता का वास्तविक शेल था?

मैं इसे बैश के दो अलग-अलग संस्करणों के साथ करने की कोशिश कर रहा हूं। पुराना संस्करण वास्तविक शेल है। इसमें दिखाई देता है chsh -l, हमेशा की तरह स्थित है /bin/bash, और क्या व्यवस्था मेरे खोल को मानती है। मुझे अपने शेल के रूप में नया संस्करण चाहिए। मैंने इसे एक निर्देशिका में संकलित किया है। अभी मेरे अंदर यही है .bashrc

if [ $(echo $0) != $PATH_TO_NEW_SHELL_EXECUTABLE ]; then
    export SHELL=$PATH_TO_NEW_SHELL_EXECUTABLE
    exec "$SHELL" "$@"
fi

इसके साथ मुझे जो समस्या है वह यह है कि इस मशीन पर ssh के माध्यम से कमांड चलते हैं exec लाइन। rsync तथा scp लटका भी। उदाहरण के लिए, निम्नलिखित लटका होगा।

ssh user@host false

मैं इस व्यवहार को नहीं समझता। अन्यथा, यह काम करता है। मैं भी ठीक एक इंटरैक्टिव ssh सत्र शुरू कर सकते हैं।

मैं इस विशिष्ट समस्या को कैसे हल कर सकता हूं और आम तौर पर एक ठीक से स्थापित शेल के अनुकरण के बारे में सबसे अच्छा तरीका क्या है?

जवाबों:


0

जब मैं लॉगिन शेल (अन्य / नए शेल द्वारा) को निष्पादन के साथ बदलने की कोशिश करता हूं, तो मैं ट्टी खो देता हूं:

10869  1118 root        0.0  0.0  \_ sshd: username [priv] 
10907 10869 username    0.0  0.0  |   \_ sshd: username@notty  
10908 10907 username    0.0  0.0  |       \_ /bin/bash

यह समस्या हो सकती है।


क्या आपको यकीन है कि यह एक बच्चा होगा? ऐसा लगता है कि संभावना नहीं है exec शेल कमांड इससे अलग तरीके से व्यवहार करता है exec() समारोह।
Praxeolitic

क्षमा करें, हाँ आप सही हैं। exec आदेश बदल देता है एक ज्ञात प्रक्रिया के बिना शेल // मैंने एक लिटली परीक्षण किया जो मुझे दिखाता है, कि हमने ट्टी खो दिया // मेरे जवाब को अपडेट किया।
return42

0

यह लटका नहीं था। आपका आदेश नहीं चला था, लेकिन आपका नया शेल यहां है, इंटरेक्टिव और बिना किसी संकेत के

test@myhost:~$ ssh localhost false
test@localhost's password: 
echo $0
/home/test/bin/myshell
echo $#
0

अब यदि .bashrc निष्पादन से पहले आप इन पंक्तियों को जोड़ते हैं:

echo $# "$0" "$@"
sleep 300

आप देख सकते हैं कि क्या होता है:

test@myhost:~$ ssh localhost false uselessparm1 uselessparm2
0 bash

के बगल में:

|-sshd(25350)---sshd(18920)---sshd(18925)---bash(18926)---sleep(18927)

$ cat /proc/18926/cmdline |tr '\0' '\n'
bash
-c
false uselessparm1 uselessparm2

sshd वास्तव में चलेगा bash -c 'false uselessparm1 uselessparm2'

लेकिन किसी कारण से, इस संदर्भ में कमांड लाइन तर्क मौजूद हैं, लेकिन $ 1 $ 2 ... शेल में सेट नहीं किया गया है ($ # = 0)। इसलिए निष्पादन कभी भी नए शेल के अलावा और कुछ नहीं चलेगा

आपको अपनी ट्रिक ~ / .bash_profile (लॉगिन में निष्पादित) और ~ / .bashrc को छोड़ देना चाहिए

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