শেল কীভাবে বাড়ি (গুলি) জানে?


25

প্রতিটি শেলের এনভায়রনমেন্ট ভেরিয়েবল থাকে OME হোম সেট (প্রাক্তন /Users/lotolo:)। আমি যদি csh এর অধীনে থাকি unsetenv HOMEতবে আমি পারি এবং এখনও যদি করি তবে আমি cdআমার বাড়িতে থাকব। আমি এটি বাশ ( unset HOME) এও পরীক্ষা করেছি এবং এটি একই আচরণ। তাহলে শেলটি কীভাবে জানতে পারে যে আমার / অন্যান্য_উজার ব্যবহারকারী কোথায়? এটি কোথায় এই মূল্যবোধ পড়তে পারে?

এটি একটি প্রতিলিপি যেহেতু আমার প্রশ্ন না হয় কীভাবে নয় আমি জানি, কিন্তু কিভাবে শেল জানা HOME। এবং এই ব্যবহারটি অন্য ব্যবহারকারীদের কাছেও প্রসারিত।


1
@ স্টেফেনকিট, কোনও সদৃশ নয়। এখানে আমরা বর্তমান ব্যবহারকারীর হোম ডিরেক্টরিতে শেল আচরণের কথা বলছি।
স্টাফেন চেজেলাস

থেকে সহজ ক্ষেত্রে /etc/passwd। কিছু সিস্টেম এলডিএপি, এনআইএস সার্ভার ইত্যাদিতে সেই তথ্য সংরক্ষণ করতে পারে
স্যাট কাটসুরা

1
প্রোগ্রামগুলি (শাঁস সহ) কেবল কল getpwuid(3)বা অনুরূপ। এলডিএপি, এনআইএস, এনআইএস + ইত্যাদি getpwuid(3)থেকে তথ্য আহরণের জন্য কিছু সিস্টেম "পুনরায় রুটে" কনফিগার করা যেতে পারে/etc/passwd
স্যাট ক্যাটসুর

@ স্টেফেনকিট, আমার উত্তরটি দেখুন
স্টাফেন চেজেলাস

1
@ জিএডি 3 আর, উপরের আলোচনাটি দেখুন, স্টিফেনকিট ইতিমধ্যে একই অনুলিপিটির প্রতি ইঙ্গিত করেছিলেন (যা তিনি পরে প্রত্যাহার করেছিলেন), তবে আমি উপরে যুক্তি দিয়েছিলাম (এবং আমার উত্তরটিও দেখুন) যে এটি কোনও সদৃশ নয়।
স্টাফেন চেজেলাস

উত্তর:


33

ক্ষেত্রে cshএবং tcsh, এটা মান রেকর্ড $HOMEসময় শেল শুরু হয়েছিল (এ পরিবর্তনশীল তার মধ্যে $homeপরিবর্তনশীল যেমন @JdeBP দ্বারা লক্ষনীয় )।

আপনি যদি এটি শুরু করার আগে এটি সেট না করে রাখেন তবে আপনি cshএমন কিছু দেখতে পাবেন:

$ (unset HOME; csh -c cd)
cd: No home directory.

জন্য bash(এবং অন্যান্য অধিকাংশ বোর্ন মত শাঁস), আমি তোমার চেয়ে ভিন্ন আচরণ দেখুন।

bash-4.4$ unset HOME; cd
bash: cd: HOME not set

$HOMEভেরিয়েবলের সামগ্রীটি আপনার ব্যবহারকারীর নামের বিপরীতে ব্যবহারকারীর ডাটাবেসে সঞ্চিত তথ্যের ভিত্তিতে লগইন প্রক্রিয়া দ্বারা শুরু করা হয় ।

ব্যবহারকারীর নাম সম্পর্কে তথ্য সবসময় পাওয়া যায় না। সমস্ত শেল নিশ্চিতভাবে জানতে পারে যে এটি কার্যকর করছে এমন প্রক্রিয়াটির ইউজারিড এবং বিভিন্ন ব্যবহারকারী (বিভিন্ন হোম ডিরেক্টরি সহ) একই ইউজারিডটি ভাগ করতে পারেন।

সুতরাং, একবার $HOMEচলে গেলে এটি ফিরে পাওয়ার কোনও নির্ভরযোগ্য উপায় নেই।

প্রথম ব্যবহারকারীর ডাটাবেসটি ( getpwxxx()স্ট্যান্ডার্ড এপিআই সহ) প্রথম ব্যবহারকারীর হোম ডিরেক্টরিতে শেল চালানো একই ইউড থাকা কেবলমাত্র একটি আনুমানিকই হবে (ব্যবহারকারীর ডাটাবেসটি পরিবর্তিত হতে পারে (বা হোম ডিরেক্টরিটি এক সময়ের মান হিসাবে সংজ্ঞায়িত হচ্ছে) লগইন সেশন শুরু হওয়ার পরে)।

zsh আমি জানি যে একমাত্র শেলটি এটি করে:

$ env -u HOME ltrace -e getpw\* zsh -c 'cd && pwd'
zsh->getpwuid(1000, 0x496feb, 114, 0x7f9599004697)      = 0x7f95992fddc0
/home/chazelas
+++ exited (status 0) +++

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

তবুও একটি ভিন্ন আচরণ হ'ল এটি fishমনে হয় যে ব্যবহারকারীর নামের জন্য ডাটাবেসটিকে কোয়েরিতে রাখা আছে যা $USERযদি জমা থাকে বা না করে getpwuid()থাকে তবে:

$ env -u HOME USER=bin ltrace -e getpw\* fish -c 'cd;pwd'
fish->getpwnam("bin")  = 0x7fd2beba3d80
fish: Unable to create a configuration directory for fish. Your personal settings will not be saved. Please set the $XDG_CONFIG_HOME variable to a directory
where the current user has write access.
fish: Unable to create a configuration directory for fish. Your personal settings will not be saved. Please set the $XDG_CONFIG_HOME variable to a directory
where the current user has write access.
--- SIGCHLD (Child exited) ---
/bin
+++ exited (status 0) +++


$ env -u HOME -u USER ltrace -e getpw\* fish -c 'cd;pwd'
fish->getpwuid(1000, 0x7f529eb4fb28, 0x12d8790, 0x7f529e858697) = 0x7f529eb51dc0
fish->getpwnam("chazelas")                                      = 0x7f529eb51d80
--- SIGCHLD (Child exited) ---
--- SIGCHLD (Child exited) ---
/home/chazelas
+++ exited (status 0) +++

SEGV যখন ব্যবহারকারীর অস্তিত্ব থাকে না ( https://github.com/fish-shell/fish-shell/issues/3599 ):

$ env -u HOME USER=foo fish -c ''
zsh: segmentation fault  env -u HOME USER=foo fish -c ''

2
আমি মনে করি আমরা এই সমস্যাটি রিপোর্ট করতে পারি! খুব সুন্দর উত্তর বিটিডব্লিউ, ধন্যবাদ!
লোটোলো

1
@ লোটোলো, হ্যাঁ, fishবাগটি সেখানে রয়েছে কিনা তা দেখার জন্য আমি 'দ্য গিট মাথা' নিয়ে ব্যস্ত সম্পাদনা করুন। হ্যাঁ তাই হয়।
স্টাফেন চেজেলাস

এখন আমি কৌতূহলী: কোন পরিবেশের পরিবর্তনশীলটি শেলটি যদি আনসেট না করা হয় তবে সর্বাধিকভাবে ব্যবহারকারীকে বন্ধুত্বপূর্ণ করে তোলে? PATH? TERM? USER?
ব্যবহারকারী 1024

এখানে একটি বিজোড় লাইন রয়েছে: "কেবলমাত্র একটি আনুমানিকতা হবে ..." প্রথম অনুচ্ছেদেও প্রথম বন্ধনীগুলি লাইন করে না। কী হওয়ার কথা ছিল?
মুড়ু

1
@ মুরু Querying the user database... would only be...আসলে এতটা পরিষ্কার নয়
edc65

6

তাহলে শেলটি কীভাবে জানতে পারে যে আমার / অন্যান্য_উজার ব্যবহারকারী কোথায়?

এটা না। আপনি ঠিক পরীক্ষাটি সঠিকভাবে করছেন না। আপনি যেমন সি শেল ম্যানুয়াল থেকে দেখতে পাচ্ছেন, কোনও আর্গুমেন্ট সরবরাহ না করা হলে cdকমান্ডটি homeভেরিয়েবলের মানতে পরিবর্তিত হয় । যদি এই ভেরিয়েবলটি সেট না করা থাকে তবে ডিরেক্টরিটি কোথায় পরিবর্তন করতে হবে এবং কোনও ত্রুটি ছাপতে হবে তা তা জানে না:

মেশিন: set> হোম সেট করুন = /
মেশিন: / হোম / ইউজার> সিডি
মেশিন: ~> হোম আনসেট করুন
মেশিন: /> সিডি
সিডি: কোনও হোম ডিরেক্টরি নেই
মেশিন: /> 

আপনি ভুল পরিবর্তনশীল আনসেট করুন। এটি HOMEপরিবেশগত পরিবর্তনশীল নয়, এটি homeসি শেলের অভ্যন্তরীণ পরিবর্তনশীল (শেলটি শুরু হওয়ার সাথে সাথে পূর্বের মান থেকে আরম্ভ করা হয়, তবে অন্যথায় তার নিজের ডানদিকে একটি স্বাধীন ভেরিয়েবল)।


কোনও সিএস-তে নয় (কমপক্ষে আমার সংস্করণে: "টিসিএসএস 6.18.01 (অ্যাস্ট্রোন) 2012-02-14 (x86_64-আপেল-ডারউইন)") এটি বাড়ির মান বহনকারী হোম ভেরিয়েবল। তবে @ স্টেফেন চ্যাজেলাস যেমন বলেছিলেন শেলটি চালু করার আগে আমার অবশ্যই পরিবর্তনশীলটি আনসেট করতে হবে কারণ এটি শুরুর দিকে হোম মান সেট করবে।
লোটোলো

উপরেরটি হ'ল সি শেল, যা আমি একটি সহজ ওপেনবিএসডি মেশিনে দৌড়েছিলাম এবং এর আচরণ প্রদর্শন করে। এটি এমনকি টেনেক্স সি শেলও নয় (যদিও এটি একই আচরণ করে)।
JdeBP

হ্যাঁ আমি এটি দেখেছি ... আমি টাইপ করেছি cshতবে স্পষ্টতই এটির সাথে সম্পর্কিতtcsh
লোটোলো

0

লগইন করার সময় সিস্টেমটি ব্যবহারকারীর হোম ডিরেক্টরিটির একটি প্যথনাম হতে হোমে ভেরিয়েবল সেট করে। এটি দ্বারা সেট করা হয়

  • গ্রাফিকাল সেশনের জন্য জিডিএম, কেডিএম বা এক্সডিএম।
  • কনসোল, টেলনেট এবং রোগিন সেশনে লগইন করুন
  • এসএসএইচ সংযোগের জন্য এসএসডিডি

আপনি এর মান পরিবর্তন করতে পারেন তবে মনোযোগ দিন কারণ .বাশার্ক, .প্রফিল, .xinitrc, ইত্যাদি যদি তারা হোম ডিরেক্টরিতে না থাকে তবে পঠিত হবে না।


তবে আমি এটি (OME হোম) আনসেট করতে পারি ... তাই না? এবং এটি কীভাবে জানবে যে অন্য ব্যবহারকারীর বাড়ি কোথায়?
লোটোলো

1
usermod -d HOME_DIRকমান্ডটি ব্যবহার করে আপনি এটি আপডেট করতে পারেন , যখন নতুন নতুন তৈরি হয়। ডিফল্ট হোম হ'ল / হোম / $ ব্যবহারকারী নাম এবং এটি লগইন প্রোগ্রাম দ্বারা নির্ধারিত হয়।
দাবী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.