কে $ USER এবং $ USERNAME এনভায়রনমেন্ট ভেরিয়েবল সেট করে?


34

এছাড়াও, এই পরিবর্তনগুলি সর্বদা লগ-ইন করা ব্যবহারকারীর নাম (তারা আমার ডেবিয়ান সিস্টেমে কি) মিলবে? আমি কি অন্যান্য ইউনিক্স (-র মতো) সিস্টেমে তাদের উপলব্ধতা ধরে নিতে পারি?

আমিও আগ্রহী যে কেন whoamiএই পরিবর্তকগুলির কোনও পড়ার পরিবর্তে কেউ কেন ব্যবহার করবে ।


2
এ খুঁজছি manপাতা, whoamiআপনার কার্যকর ব্যবহারকারী আইডি সাথে সংশ্লিষ্ট নামটি রিপোর্ট। যার অর্থ আপনি যদি sudoকোনও সেটুইড এক্সিকিউটেবল ব্যবহার করে বা চালিত হন তবে এটি কিছু আলাদা ফেরত আসবে । আপনি যদি sudoসেট আপ করে sudo whoamiথাকেন তবে উদাহরণস্বরূপ চেষ্টা করুন ।
জোসেফ আর।

4
USERএবং USERNAMEসাধারণ পরিবেশের ভেরিয়েবল, যার অর্থ হ'ল যদি আপনি চান, আপনি এগুলি নির্বিচার মানগুলিতে সেট করতে পারেন। শুধু টাইপ করুন USER=xyz। অন্য কথায়, vari ভেরিয়েবলগুলি বিদ্যমান থাকলেও, লগ-ইন করা ব্যবহারকারীর নামটির সাথে তাদের মানগুলি মেলে এমন কোনও গ্যারান্টি নেই।
উয়েউ

@ উওউ দ্বারা guarantee, আমি ডিফল্টরূপে বলতে চাইছি (যেমন ধরে নিই ব্যবহারকারী তাদের পরিবর্তন করেনি)।
tshpang

2
@ শেপাপাং আমার প্রথম মন্তব্যের অনুসরণ হিসাবে: এর ফলাফলের তুলনা করুন sudo whoamiএবংsudo echo $USER
জোসেফ আর

2
@JosephR। কারণ sudo echo $USER, শেলটি প্রসারিত হয় $USER, তারপরে কল করে sudo। অবশ্যই এটি একই আউটপুট উত্পাদন করে না whoami। মত sudo whoami, sudo sh -c 'echo $USER'না (সাধারণত) আউটপুট rootEID ব্যবহার সম্পর্কে আপনার মন্তব্য সম্পর্কেwhoami , নোট করুন যে ইউআইডি ব্যবহার করা হলেও sudo whoamiআউটপুট হবে । কমান্ডটি চালিত হওয়ার জন্য EID এবং UID উভয়ই সেট করে (খুব অস্বাভাবিক পরিস্থিতিতে আপনি এটিকে অন্যথায় আচরণের জন্য স্পষ্টভাবে কনফিগার করেছেন)। তুলনা করার জন্য । rootwhoamisudosudo id -usudo id -ru
এলিয়াহ কাগন

উত্তর:


29

এটা লগইন

লিনাক্স লগইন (1) ম্যান পৃষ্ঠাতে বলেছেন:

জন্য মান $ হোম , $ USER কে , $ শেল , $ PATH- , $ LOGNAME , এবং $ মেল পাসওয়ার্ড এন্ট্রি উপযুক্ত ক্ষেত্র অনুযায়ী সেট করা হয়।

ফ্রিবিএসডি লগইন (1) ম্যান পৃষ্ঠাটি বলেছেন:

লগইন ইউটিলিটি পরিবেশের মধ্যে তথ্য প্রবেশ (দেখুন পরিবেশ (7) ) ব্যবহারকারীর হোম ডিরেক্টরি (হোম), কমান্ড ব্যাখ্যাকারী (শেল), সার্চ পথ (পথ), টার্মিনাল প্রকার (শব্দ) এবং ব্যবহারকারী নাম উল্লেখ (উভয় LOGNAME এবং ব্যবহারকারী) ।

NetBSD বা , OpenBSD এবং OS X এর man পৃষ্ঠা বলতে একই জিনিস।

ইউজ-লিনাক্স লগইন থেকে উত্স কোডটি এখানে রয়েছে :

setenv("HOME", pwd->pw_dir, 0); /* legal to override */
setenv("USER", pwd->pw_name, 1);
setenv("SHELL", pwd->pw_shell, 1);
/* ... */
setenv("LOGNAME", pwd->pw_name, 1);

ফ্রিবিএসডি লগইন থেকে উত্স কোডটি এখানে রয়েছে :

(void)setenv("LOGNAME", username, 1);
(void)setenv("USER", username, 1);
(void)setenv("PATH", rootlogin ? _PATH_STDPATH : _PATH_DEFPATH, 0);

2
আমার ফেডোরা 16 বাক্সে, আমি উভয়ই রেখেছি USERএবং USERNAMEসেট করেছি এবং আপনার আদেশটি কেবলমাত্র ফিরে আসে LOGNAME
জোসেফ আর।

1
@ জোসেফআর, দুর্ভাগ্যক্রমে আমার হাতে ফেডোরা নেই তবে আমি ফ্রিবিএসডি'র উত্সগুলিতেও নজর রেখেছি, ইউপিডি দেখুন ..
পোয়েজ

তবে ফেডোরার ক্ষেত্রে এটি অবশ্যই স্পষ্ট নয়। আমি যা বলছি loginতা হ'ল এই ভেরিয়েবলগুলি সেট করা একমাত্র জিনিস বলে মনে হচ্ছে না।
জোসেফ আর।

1
নোট করুন যে লিনাক্স কেবল একটি কার্নেল, এর কোনও loginকমান্ড নেই। ওএসগুলি যে লিনাক্সকে তাদের কার্নেল হিসাবে ব্যবহার করে তারা যে কোনও পছন্দসই প্রয়োগ করতে পারে না। উদাহরণস্বরূপ, ডেবিয়ান ভিত্তিক সিস্টেমগুলি ব্যবহার-লিনাক্স নয়, ছায়া-ব্যবহারগুলি থেকে একটি ব্যবহার করতে ঝোঁক।
স্টাফেন চেজেলাস

1
নোট করুন যে loginপ্রায়শই sshগ্রাফিকাল লগইন পরিচালকদের উপর বা লগ ইন করার সময় অনুরোধ করা হয় না ।
স্টাফেন চেজেলাস

11

কোন নিয়ম নেই। কিছু শাঁস পছন্দ tcshবা zshসেট $LOGNAMEzshসেট $USER

এটা কিছু বিষয় আছে যা তোমার মত লগ ইন করুন দ্বারা সেট করা হতে পারে login(যেমন দ্বারা প্রার্থনা gettyমত অন্যান্য বিষয়ের দ্বারা একটি টার্মিন্যালে যখন লগইন এবং কখনও কখনও in.rlogind), cron, su, sudo, sshd, rshd, গ্রাফিকাল লগ-ইন ম্যানেজার বা নাও হতে পারে।

যদিও আমার অভিজ্ঞতায় লগইন হয়েছে, $USERসাধারণত সেট করা থাকে (তবে এটি লগইন সেশনের মধ্যে ব্যবহারকারীর আইডি (সেটুইড কমান্ডের মাধ্যমে) পরিবর্তনের পরে আপডেট করা যাবে না OS পজিক্সের জন্য $LOGNAMEলগইন (এবং cron) সেট করা দরকার ।

পোর্টেবলভাবে লগইন নামটি পেতে, lognameকমান্ডটি ব্যবহার করা ভাল (যদি কোনও লগইন না হয় তবে এটি কিছুই না ফেরায়)। ব্যবহারকারীর আইডি পেতে, ব্যবহার করুন id -u। একটি ব্যবহারকারীর নাম বর্তমান কার্যকর ব্যবহারকারী আইডি সংশ্লিষ্ট পেতে: id -un। এগুলির সবগুলি পেতে (বেশিরভাগ সময়, প্রতিটি ব্যবহারকারী আইডিতে কেবল একটি ব্যবহারকারী নাম থাকে তবে এটির নিশ্চয়তা নেই):

perl -le 'while ($n = getpwent()) {print $n if getpwnam($n) == $>}'

যদিও এটি এমন সিস্টেমে কাজ না করতে পারে যেখানে ব্যবহারকারী ডাটাবেস গণনা করা যায় না (যেমন নেটওয়ার্কের ব্যবহারকারী ডাটাবেসের সাথে উদাহরণস্বরূপ কখনও কখনও ঘটে থাকে)।


3

আপনি সম্ভবত এখানে পসিক্স স্ট্যান্ডার্ডের উপর নির্ভর করতে চান , যেহেতু সময়ে সময়ে আপনি সম্ভবত কেবল ব্যবহারকারী লগইন না ( loginপ্রোগ্রাম দ্বারা পরিচালিত ) তবে cronচাকরি এবং অন্যান্য বিষয়েও যত্নশীল হবেন ।

অতএব, আপনার জানা উচিত যে পসিক্সের প্রয়োজন হয় $LOGNAMEতবে তা নয় $USER। উদাহরণস্বরূপ $USERক্রোন দ্বারা সেট নাও করা যেতে পারে, যেমন কীথ থম্পসনের উত্তরে উল্লেখ করা হয়েছে , এটি সিস্টেম-ভি বনাম বিএসডি-র ইতিহাসের সাথে কীভাবে সম্পর্কিত তার কিছু ইতিহাস উল্লেখ করে:

... কমপক্ষে আমার সিস্টেমে (উবুন্টু 14.04) $ ব্যবহারকারী পরিবেশ পরিবর্তনশীল ক্রোন কাজের জন্য সেট করা নেই। পরিবর্তে, আপনি $ LOGNAME ব্যবহার করতে পারেন, যা ক্রোন কাজের জন্য পরিবেশের অংশ।

মতে পরিবেশ (7) man পৃষ্ঠা (টাইপ মানুষ পরিবেশ এটা পড়তে), $ USER কে বাসদ-ডিরাইভড প্রোগ্রাম দ্বারা ব্যবহার করা হয় এবং $ LOGNAME সিস্টেম-ভি-ডিরাইভড প্রোগ্রাম দ্বারা ব্যবহার করা হয়।


1

যদি আপনি পরিবেশের ভেরিয়েবলগুলি ( whoamiবা এর পরিবর্তে getpwentএবং getpwnam) ব্যবহার করতে চান এবং আপনি নিশ্চিত হন না যে সব * এনআইএক্স সিস্টেমে সর্বদা একইভাবে সেট করা থাকে তবে ব্যাশে এটি চেষ্টা করুন:

THIS_USER=${USER:-${USERNAME:-${LOGNAME}}}
echo ${THIS_USER}

যদি এটির পরেও এটি খালি থাকে, তবে আপনি বরং একটি বৌদ্ধিক সিস্টেমে রয়েছেন। ;)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.