घर कैसे प्राप्त करें, USER दिया?


41

USERमेरी स्क्रिप्ट में एक चर है, और मैं चर के HOMEआधार पर उसका रास्ता देखना चाहता हूं USER। मैं उसे कैसे कर सकता हूँ?

जवाबों:


72

एक उपयोगिता है जो उपयोगकर्ता की जानकारी की परवाह किए बिना चाहे वह जानकारी स्थानीय फ़ाइलों जैसे कि /etc/passwdLDAP या किसी अन्य विधि में संग्रहीत हो । इसे कहते हैं getent

इसमें से उपयोगकर्ता जानकारी प्राप्त करने के लिए, आप चलाते हैं getent passwd $USER। आपको एक पंक्ति वापस मिलेगी जो दिखता है:

[jenny@sameen ~]$ getent passwd jenny
jenny:*:1001:1001:Jenny Dybedahl:/home/jenny:/usr/local/bin/bash

अब आप बस इसमें से होम डायर काट सकते हैं, जैसे कि कट का उपयोग करके, जैसे:

[jenny@sameen ~]$ getent passwd jenny | cut -d: -f6
/home/jenny

getent बेहतर उत्तर है, विशेष रूप से दूरस्थ उपयोगकर्ता के साथ। सरल सिस्टम में ~ उपयोगकर्ता पर्याप्त होना चाहिए। आपको मोड दिया गया।
रुई एफ रिबेरो

@ RuiFRibeiro आप ~fooचर में उपयोग नहीं कर सकते हैं bash। वैसे भी सीधे नहीं।
मुरु

1
@ मुरु - यह सच है - और व्यवहार है। ~टैब-विस्तार, हालांकि प्रतीत होता है, और का एक और spec'd व्यवहार टिल्ड-उपसर्ग का उपयोग कर प्राप्त लॉगिन नाम के साथ जुड़े प्रारंभिक कार्यशील निर्देशिका के पथ नाम से बदल दिया जाएगा getpwnam()समारोह और इतने शायद कि देखने में बहुत अच्छा है। मुझे टैब-विस्तार पसंद नहीं है, हालांकि - मुझे टैब टाइप करना पसंद है।
15

1
ध्यान दें कि यह केवल आपको $ HOME का प्रारंभिक मूल्य देता है; उपयोगकर्ता की लॉगिन स्क्रिप्ट पूरी तरह से इसे किसी और चीज़ में बदलने के हकदार हैं। यह एक असामान्य बात है, लेकिन मैं उन स्थितियों के बारे में सोच सकता हूं जहां यह समझदारी होगी, जैसे कि स्थानीय और एनएफएस-घुड़सवार होमडायर के बीच चयन करना।
zwol 21

1
@ HagenvonEitzen Colons को ठीक से मना किया जाता है क्योंकि उनका उपयोग खेतों को अलग करने के लिए किया गया है।
जेनी डी

9

आप evalकिसी के घर निर्देशिका प्राप्त करने के लिए उपयोग कर सकते हैं ।

eval echo "~$USER"

कम से कम स्थानीय उपयोगकर्ताओं के लिए यह सुनिश्चित करने के लिए काम करता है। मुझे नहीं पता कि एलडीएपी जैसे रिमोट यूजर्स को संभाला जाता है या नहीं eval


1
वहाँ eval के लिए कोई ज़रूरत नहीं है। अपने अंग्रेजी के साथ सावधान रहें।
रुई एफ रिबेरो 18

4
@nwk a evalकी जरूरत है। ~fooपरिवर्तनशील विस्तार के बाद बैश प्रक्रिया नहीं करता है ।
मुरु

1
दिलचस्प, धन्यवाद, हालांकि यह केवल वर्तमान उपयोगकर्ता की निर्देशिका प्राप्त करता है, अन्य उपयोगकर्ताओं की नहीं। मुझे लगता है कि LDAP उपयोगकर्ता संभाले नहीं हैं, हालांकि मैं गलत हो सकता हूं।
रुई एफ रिबेरो

3
@RuiFRibeiro यह LDAP के साथ ठीक काम करेगा, बस उस चर का उपयोग करें जिसमें आपके LDAP उपयोगकर्ता के उपयोगकर्ता नाम के बजाय होता है USER
मुरु

3
यह सत्यापित करने के बिना इसका उपयोग न करें कि वर्णमाला के केवल एक स्ट्रिंग $USERतक फैलता है ।
चेपनर

4

सामान्य स्थान है /home/$USER, लेकिन इसका सार्वभौमिक होना जरूरी नहीं है। ऐसी जानकारी खोजने के लिए निश्चित स्थान फ़ाइल के अंदर है /etc/passwd

वह फ़ाइल विश्व पठनीय है (कोई भी इसे पढ़ सकता है), इसलिए किसी भी उपयोगकर्ता की सामग्री तक पहुंच है।
यदि फ़ाइल में $ USER मौजूद है, तो पिछली में प्रविष्टि उपयोगकर्ता HOME डायरेक्टरी है।

यह प्रविष्टि का चयन करेगा और गृह निर्देशिका प्रिंट करेगा:

awk -v FS=':' -v user="$USER" '($1==user) {print $6}' "/etc/passwd"

अधिक जटिल (रिमोट) सिस्टम के लिए, एनएसएस (नाम सेवा स्विच लाइब्रेरी) सिस्टम से उपयोगकर्ताओं को जानकारी प्राप्त करने के लिए गेटेंट सामान्य आदेश है।

की एक कमान

echo $(getent passwd $USER )| cut -d : -f 6

समकक्ष जानकारी प्रदान करेगा (यदि उपलब्ध हो)।


2
आपके पास इसके लिए ~ उपयोगकर्ता है, और आपका समाधान उपयोगकर्ताओं को अधिक जटिल प्रणालियों में चिंतन नहीं करता है, जैसे कि LDAP से आने वाला उपयोगकर्ता जहां आपको अप्रेंटिस का उपयोग करना है।
रुई एफ रिबेरो

2

यदि उपयोगकर्ता मौजूद नहीं है, getentतो त्रुटि वापस आएगी।

यहां एक छोटा शेल फ़ंक्शन है जो बाहर निकलने के कोड को अनदेखा नहीं करता है getent:

get_home() {
  local result; result="$(getent passwd "$1")" || return
  echo $result | cut -d : -f 6
}

यहाँ एक उदाहरण है:

da_home="$(get_home missing_user)" || {
  echo 'User does NOT exist!'; exit 1
}

# Now do something with $da_home
echo "Home directory is: '$da_home'"

1

यदि आप रूट के रूप में लॉग इन हैं, यदि आप USERपासवर्ड जानते हैं, या यदि आपके USERपास कोई पासवर्ड नहीं है, तो निम्नलिखित एक और विकल्प है:

    su -c 'echo ~' ${USER}

मानक suव्यवहार के तहत , यदि USERअपरिभाषित या खाली है, तो suकमांड को रूट के रूप में चलाने का प्रयास करेंगे।

यदि मान USERमान्य उपयोगकर्ता नाम नहीं है, तो एक उचित त्रुटि उठाई जाएगी su: user <user> does not exist:।

यहाँ पहले से ही बहुत सारे अच्छे उत्तर हैं लेकिन यह अभी भी किसी की मदद कर सकता है।


यह सिस्टम कॉन्फिगर के आधार पर सुरक्षित नहीं है। यह उस उपयोगकर्ता के रूप में एक प्रक्रिया (शेल रनिंग इको) चलाता है, इसलिए उपयोगकर्ता शेल का उपयोग कर सकता है और आपको मनमाना आउटपुट दे सकता है। यह उपयोगकर्ता के सेटअप में भी चल रहा है, इसलिए यह संभव है कि उपयोगकर्ता शेल कॉन्फिग फाइल चलाए जाएं (जो मनमाना आउटपुट भी दे सकते हैं)। या पम के माध्यम से पर्यावरण भार। आदि या बस के रूप में सरल रूप में कुछ करते हैं यह एक SIGSTOP भेजने के लिए यह हमेशा के लिए ले, प्रभावी रूप से डॉस अपनी स्क्रिप्ट पर हमला।
derobert
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.