আমি প্রায়শই কোনও ব্যবহারকারীর আইডির সাথে যুক্ত লগইন নামটি পেতে চাই এবং এটি সাধারণ ব্যবহারের ক্ষেত্রে প্রমাণিত হওয়ায় আমি এটি করার জন্য একটি শেল ফাংশন লেখার সিদ্ধান্ত নিয়েছি। আমি প্রাথমিকভাবে জিএনইউ / লিনাক্স বিতরণগুলি ব্যবহার করার সময়, আমার স্ক্রিপ্টগুলি যথাসম্ভব পোর্টেবল হওয়ার জন্য এবং আমি যা করছি তা পসিক্স-সামঞ্জস্যপূর্ণ কিনা তা পরীক্ষা করার চেষ্টা করি।
ব্যকরণগত /etc/passwd
আমি যে প্রথম পদ্ধতির চেষ্টা করেছি তা হ'ল পার্স /etc/passwd
(ব্যবহার awk
)।
awk -v uid="$uid" -F: '$3 == uid {print $1}' /etc/passwd
যাইহোক, এই পদ্ধতির সাথে সমস্যাটি হ'ল লগইনগুলি স্থানীয় নাও হতে পারে, উদাহরণস্বরূপ, ব্যবহারকারীর প্রমাণীকরণ NIS বা LDAP এর মাধ্যমে হতে পারে।
getent
কমান্ডটি ব্যবহার করুন
ব্যবহার getent passwd
করা পার্সিংয়ের চেয়ে বেশি পোর্টেবল /etc/passwd
কারণ এটি অ-স্থানীয় এনআইএস বা এলডিএপি ডাটাবেসকেও অনুসন্ধান করে।
getent passwd "$uid" | cut -d: -f1
দুর্ভাগ্যক্রমে, getent
ইউটিলিটিটি পসিক্স দ্বারা নির্দিষ্ট করা মনে হচ্ছে না।
id
কমান্ডটি ব্যবহার করুন
id
ব্যবহারকারীর পরিচয় সম্পর্কে ডেটা পাওয়ার জন্য পসিক্স-মানকৃত ইউটিলিটি।
BSD এবং GNU বাস্তবায়নগুলি একটি ব্যবহারকারী আইডি অপারেন্ড হিসাবে গ্রহণ করে:
- আইডি (1) - ওপেনবিএসডি ম্যানুয়াল পৃষ্ঠাগুলি
- আইডি (1) - ফ্রিবিএসডি ম্যান পৃষ্ঠা
- জিএনইউ কোরিটিলস: আইডি অনুরোধ
এর অর্থ এটি কোনও ব্যবহারকারীর আইডির সাথে যুক্ত লগইন নামটি মুদ্রণের জন্য ব্যবহার করা যেতে পারে:
id -nu "$uid"
তবে অপারেন্ড হিসাবে ব্যবহারকারী আইডি সরবরাহ করা পসিক্সে নির্দিষ্ট করা হয়নি; এটি কেবল অপারেন্ড হিসাবে লগইন নামের ব্যবহারের বর্ণনা দেয় ।
উপরোক্ত সমস্ত সংমিশ্রণ
আমি উপরোক্ত তিনটি পদ্ধতির সমন্বয়ের বিষয়টি নিম্নলিখিতগুলির মতো কিছুতে বিবেচনা করেছি:
get_username(){
uid="$1"
# First try using getent
getent passwd "$uid" | cut -d: -f1 ||
# Next try using the UID as an operand to id.
id -nu "$uid" ||
# As a last resort, parse `/etc/passwd`.
awk -v uid="$uid" -F: '$3 == uid {print $1}' /etc/passwd
}
যাইহোক, এটি আটকানো, অচল এবং আরও গুরুত্বপূর্ণ - মজবুত নয়; এটি ব্যবহারকারীর আইডি অবৈধ বা বিদ্যমান না থাকলে এটি শূন্য-শর্তহীন অবস্থার সাথে প্রস্থান করে। আমি লম্বা এবং ক্লানকিয়ার শেল স্ক্রিপ্ট লিখার আগে যা প্রতিটি কমান্ডের অনুরোধের প্রস্থান স্থিতি বিশ্লেষণ করে এবং সঞ্চয় করে রাখে, আমি ভেবেছিলাম আমি এখানে জিজ্ঞাসা করব:
লগ-ইন নামটি কোনও ব্যবহারকারীর আইডির সাথে যুক্ত করার জন্য আরও কি মার্জিত এবং বহনযোগ্য (পসিক্স-সামঞ্জস্যপূর্ণ) উপায় আছে?
getent
বা id
করবে না ; তাদের সমস্ত সন্ধান করার একমাত্র উপায় হ'ল সমস্ত ব্যবহারকারীকে গণনা করা, যদি ব্যবহারকারী ডাটাবেস এটির অনুমতি দেয়। ( /etc/passwd
সেখানে সংজ্ঞায়িত ব্যবহারকারীদের জন্য কাজগুলি সন্ধান করছেন , স্পষ্টতই।)
/etc/passwd
এবং /etc/shadow
এই দৃশ্যকল্প পরীক্ষা এবং যাচাই উভয় যে id
এবং getent passwd
আচরণ দেখে আপনি বর্ণনা। যদি, কোনও পর্যায়ে, আমি এমন একটি সিস্টেম ব্যবহার করে শেষ করি যেখানে ব্যবহারকারীর একাধিক নাম থাকে, আমি এই সিস্টেম ইউটিলিটিগুলির মতোই করব এবং কেবল প্রথম ব্যবহারটিকে ব্যবহারকারীর নাম হিসাবে আখ্যায়িত করব।
setuid(some_id)
এমন কোনও প্রয়োজন নেই some_id
। লিনাক্সে ব্যবহারকারীর নেমস্পেসের মতো জিনিসগুলির সাথে এটি আপনার স্ক্রিপ্টগুলির জন্য পঙ্গু ধারণা হতে পারে।
getpwuid()
যা ফাংশনটি কল করার একটি ব্যয়বহুল পদ্ধতির মতো বলে মনে হয় যা ls
নামগুলি লগইন করতে ইউআইডি অনুবাদ করে। গিলসের উত্তর এটি অর্জনের আরও প্রত্যক্ষ এবং দক্ষ উপায়।