কীভাবে হোমম পাবেন, ইউএসআই দেওয়া?


41

USERআমার স্ক্রিপ্টে আমার একটি ভেরিয়েবল রয়েছে এবং আমি ভেরিয়েবলের HOMEভিত্তিতে তার পথটি দেখতে চাই USER। আমি এটা কিভাবে করবো?

উত্তর:


72

একটি ইউটিলিটি রয়েছে যা স্থানীয় তথ্য যেমন /etc/passwdএলডিএপি বা অন্য কোনও পদ্ধতিতে সংরক্ষণ করা হয় তা নির্বিশেষে ব্যবহারকারীর তথ্য অনুসন্ধান করবে । এটি বলা হয় 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

জেন্টেন্ট হ'ল আরও ভাল উত্তর, বিশেষত দূরবর্তী ব্যবহারকারীর সাথে। সহজ সিস্টেমে-ব্যবহারকারী যথেষ্ট হওয়া উচিত। মোডেড আপ
রুই এফ রিবেইরো

@RuiFRibeiro আপনি ব্যবহার করতে পারবেন না ~fooভেরিয়েবল সঙ্গে bash। সরাসরি নয়, যাই হোক।
মুরু

1
@ মুরু - এটি সত্য - এবং এটি আচরণ নির্দিষ্ট। ~ট্যাব-প্রসারিত, যদিও বলে মনে হচ্ছে না, এবং অন্য spec'd আচরণ টিল্ড-উপসর্গ ব্যবহার প্রাপ্ত লগইন নাম যুক্ত প্রাথমিক কাজ ডিরেক্টরির একটি পথনাম দ্বারা প্রতিস্থাপিত হইবে getpwnam()ফাংশন এবং তাই সম্ভবত লুকআপ বেশ ভাল। আমি ট্যাব-প্রসারণ পছন্দ করি না, যদিও - আমি ট্যাবগুলি টাইপ করতে চাই।
মাইকজারভেল

1
নোট করুন যে এটি কেবল আপনাকে $ HOME এর প্রাথমিক মান দেয়; ব্যবহারকারীর লগইন স্ক্রিপ্টগুলি এটিকে অন্য কিছুতে পরিবর্তনের জন্য পুরোপুরি অধিকারী। এটি করা একটি অস্বাভাবিক জিনিস, তবে আমি এমন পরিস্থিতিগুলি নিয়ে ভাবতে পারি যেখানে এটি বোধগম্য হবে, উদাহরণস্বরূপ স্থানীয় এবং একটি এনএফএস-মাউন্টযুক্ত হোমডির মধ্যে নির্বাচন করা।
zwol

1
@ হ্যাগেভনএইটজেন কলোনসকে স্পষ্টভাবে নিষিদ্ধ করা হয়েছে কারণ তারা ক্ষেত্রগুলি পৃথক করতে ব্যবহৃত হয়েছে।
জেনি ডি

9

evalকারওর হোম ডিরেক্টরি পেতে আপনি ব্যবহার করতে পারেন ।

eval echo "~$USER"

কমপক্ষে স্থানীয় ব্যবহারকারীদের জন্য এটি নিশ্চিতভাবে কাজ করে। আমি জানি না এলডিএপি-র মতো দূরবর্তী ব্যবহারকারীরা যদি পরিচালনা করে থাকেন কিনা eval


1
সেখানে eval প্রয়োজন নেই। আপনার ইংলিশ নিয়ে সাবধান থাকুন।
রুই এফ রিবেইরো

4
@nwk an evalদরকার। ~fooপরিবর্তনশীল প্রসারণের পরে বাশ প্রক্রিয়া করে না ।
মারু

1
আকর্ষণীয়, ধন্যবাদ, তবে এটি কেবলমাত্র বর্তমান ব্যবহারকারীর ডিরেক্টরি পায় , অন্য ব্যবহারকারীদের নয়। আমি মনে করি এলডিএপি ব্যবহারকারীরা পরিচালিত হয় না, যদিও আমি ভুল হতে পারি।
রুই এফ রিবেইরো

3
@ রুইএফরিবিয়েরো এটি এলডিএপি-র সাথে ভাল কাজ করবে, আপনার এলডিএপি ব্যবহারকারীর ব্যবহারকারীর নাম পরিবর্তনের পরিবর্তে কেবলমাত্র ব্যবহার করুন USER
মুড়ু

3
যে যাচাই ছাড়াই এই ব্যবহার করবেন না $USERবিস্তৃতি শুধু বর্ণমালা একটি একক পংক্তি।
চ্যানার

4

সাধারণ জায়গাটি /home/$USERতবে এটি সর্বজনীন হতে পারে না। এই জাতীয় তথ্য অনুসন্ধানের সুনির্দিষ্ট জায়গাটি ফাইলের অভ্যন্তরে /etc/passwd

এই ফাইলটি বিশ্ব পঠনযোগ্য (যে কেউ এটি পড়তে পারে), সুতরাং যে কোনও ব্যবহারকারীর এর সামগ্রীতে অ্যাক্সেস রয়েছে।
যদি ফাইলটিতে $ USER উপস্থিত থাকে তবে শেষের প্রবেশটি হ'ল ব্যবহারকারীর হোম ডিরেক্টরি।

এটি এন্ট্রি নির্বাচন করবে এবং হোম ডিরেক্টরি মুদ্রণ করবে:

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

আরও জটিল (রিমোট) সিস্টেমগুলির জন্য, এনএসএস (নাম পরিষেবা স্যুইচ লাইব্রেরি) সিস্টেম থেকে ব্যবহারকারীদের তথ্য পাওয়ার জন্য জেন্টেন্ট হ'ল সাধারণ আদেশ।

একটি আদেশ

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

সমপরিমাণ তথ্য সরবরাহ করবে (যদি পাওয়া যায়)।


2
আপনার জন্য এটির ~ ব্যবহারকারী রয়েছে এবং আপনার সমাধানটি আরও জটিল সিস্টেমে যেমন ব্যবহারকারীদের এলডিএপি থেকে আসে যেখানে আপনাকে জেন্ট ব্যবহার করতে হয় সেখানে ব্যবহারকারীদের মতো চিন্তা করে না।
রুই এফ রিবেইরো

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

এখানে ইতিমধ্যে প্রচুর ভাল উত্তর রয়েছে তবে এটি এখনও কাউকে সহায়তা করতে পারে।


এটি সিস্টেম কনফিগারেশনের উপর নির্ভর করে সুরক্ষিত নয়। এটি সেই ব্যবহারকারীর হিসাবে একটি প্রক্রিয়া (শেল চলমান ইকো) চালায়, যাতে ব্যবহারকারী (উদাহরণস্বরূপ) শেলটি পিট্রেস করতে এবং আপনাকে স্বেচ্ছাচারিত আউটপুট দিতে পারে। এটি ব্যবহারকারীর সেটআপেও চলছে, সুতরাং এটি সম্ভব যে ব্যবহারকারীদের শেল কনফিগারেশন ফাইলগুলি চালিত হয় (যা নির্বিচারে আউটপুটগুলিও দিতে পারে)। বা প্যামের মাধ্যমে পরিবেশের বোঝা। ইত্যাদি বা এটিকে চিরকাল গ্রহণের জন্য একটি সাইনস্টপ প্রেরণের মতো সহজ কিছু করুন, কার্যকরভাবে আপনার স্ক্রিপ্টে ডস আক্রমণ করা।
ডারোবার্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.