2012-08-09 17 views
8

पर प्रतीक्षा नहीं कर रहा है मैं कमांड को दूसरे उपयोगकर्ता के रूप में चलाने और उस उपयोगकर्ता के रूप में इनपुट पढ़ने की कोशिश कर रहा हूं। किसी कारण से स्क्रिप्ट read कमांड पर रोक नहीं देती है, मुझे यकीन है कि क्यों। क्यों इस read name या read email पर रोक नहीं है के रूप मेंबैश स्क्रिप्ट

#!/bin/bash 
username='anthony' 
sudo -H -u "$username" bash << 'END_COMMAND' 

# Commands to be run as new user 
# ------------------------------- 

echo "#! Running as new user $USER..." 


echo "#! Gathering setup information for $USER..." 
echo -n "Enter your name and press [ENTER]: " 
read name 
echo -n "Enter your email and press [ENTER]: " 
read email 
END_COMMAND 

echo "Done" 

कोई भी विचार: यहाँ स्क्रिप्ट का एक उदाहरण है?

उत्तर

20

read stdin से पढ़ रहा है, और bash हेडोक से आ रहा है, जो सूडो से अपने stdin विरासत में है। यदि आप इसे कहीं और से आना चाहते हैं, तो आपको स्पष्ट होना चाहिए। उदाहरण के लिए:

bash 3<&0 << 'END_COMMAND' 
... 
read <&3 
... 

यह सूडो के साथ काम नहीं करता है, हालांकि, सूडो गैर-मानक फ़ाइल वर्णनकर्ताओं को बंद कर देता है। इसलिए यदि आप उस फ़ाइल वर्णनकर्ता पुन: उपयोग के साथ भाग प्राप्त कर सकते हैं, तो आप ऐसा करने में सक्षम हो सकता है लेकिन sudo नहीं पास stderr करता है,:

sudo -H -u "$username" bash 2<&0 << 'END_COMMAND' 
... 
read -u 2 email 
... 

लेकिन यह करने के लिए शायद ज्यादा सुरक्षित है:

sudo -H -u "$username" bash << 'END_COMMAND' 
... 
read email < /dev/tty 
... 
+0

ग्रेट उत्तर, धन्यवाद। – alukach

0

कर सकते हैं आप क्या यह स्क्रिप्ट जांचती है कि यह सूडो के रूप में चल रहा है, और यदि यह नहीं है, तो खुद को सुडो के साथ निष्पादित करें?

#!/bin/bash 
username='anthony' 

if [[ -z "${SUDO_USER}" ]]; then 
    exec sudo -H -u "${username}" -- $0 
fi 

echo " 
# Commands to be run as new user 
# ------------------------------- 
" 
echo "#! Running as new user $USER..." 

echo "#! Gathering setup information for $USER..." 
echo -n "Enter your name and press [ENTER]: " 
read name 
echo -n "Enter your email and press [ENTER]: " 
read email 
संबंधित मुद्दे