লগইন শেল কোথায় সংজ্ঞায়িত করা হয়?


16

আমি sudo -i/-s এখানে পার্থক্য পড়া ছিল । কমান্ড ব্যবহারের পরে shoptএটি লক্ষ করা যায় যে সমস্ত ( sudo su/sudo -i/sudo -s) সমস্ত $SHELLএকই ফলাফল প্রদান করে তবে shoptকমান্ডের ফলাফলগুলি ভিন্ন।

সুতরাং, লগইন এবং নন লগইন শেল কীভাবে সংজ্ঞায়িত করা হয়?

shoptফলাফল কোথা থেকে পাবেন?

কেন এটি সম্পর্কিত নয় $SHELL?

sudo su

givinv@87-109:~$ sudo su
root@87-109:/home/givinv# 
root@87-109:/home/givinv# 
root@87-109:/home/givinv# shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
No login shell
root@87-109:/home/givinv# echo $SHELL
/bin/bash
root@87-109:/home/givinv# 
root@87-109:/home/givinv# exit
givinv@87-109:~$ 

sudo -i

givinv@87-109:~$ sudo -i
root@87-109:~# 
root@87-109:~# shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
Login shell
root@87-109:~# echo $SHELL
/bin/bash
root@87-109:~# 

sudo -s

root@87-109:~# sudo -s
root@87-109:~# shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
No login shell
root@87-109:~# echo $SHELL
/bin/bash
root@87-109:~# 

7
একটি সমস্যা হ'ল "লগইন শেল" এর দুটি অর্থ রয়েছে: ১. এটি একটি শেলটির একটি নির্দিষ্ট উপায়ে শুরু করা একটি উদাহরণ যা নির্দিষ্ট কাজ করে (যেমন পাঠ .profileবা সমতুল্য), এবং ২ It's ব্যবহারকারী হিসাবে সংজ্ঞায়িত /etc/passwdবা সমতুল্য। $SHELLপরেরটি রয়েছে, আপনার shoptফলাফলগুলি পূর্বের সাথে ডিল করে। সাধারণত, যখন (2) শেলটি লগইন করার সময় শুরু হয়, তখন এটি (1) এর জন্য প্রয়োজনীয় নির্দিষ্ট পদ্ধতিতে শুরু করা হয়, সুতরাং অর্থের সংমিশ্রণ।
মুরু

1
@ মুরুর ব্যাখ্যাটি ভাল। উদাহরণস্বরূপ, যদি আপনি একটি দূরবর্তী মেশিন থেকে আপনার কম্পিউটারে এসএসএইচ করেন। আপনার সিস্টেমে / usr / sbin / sshd দ্বারা একটি শেলটি কাঁটাবে $SHELL(এবং এটি সিউডো টার্মিনালের সাথে সংযুক্ত করুন) যা আপনার / ইত্যাদি / পাসডাব্লু প্রবেশে সংজ্ঞায়িত করা হবে। এই শেলটি একটি লগইন শেল এবং এটি দিয়ে পরীক্ষা করা যায় if [[ -o login ]]; then echo "I am a login shell"; fi। লগইন শেল হওয়ায় এটি একটি নতুন অধিবেশন অনুযায়ী উপযুক্ত কাজগুলি সম্পাদন করবে। উদাহরণস্বরূপ উত্স ~/.zprofileবা অনুরূপ যা সম্ভবত পরিবেশের ভেরিয়েবল এবং কোনও কাস্টম শেল কোড সেট করতে পারে যা আপনি এই সময়ে চালাতে চান
the_velour_fog

উত্তর:


17

টি এল; ডিআর :

  • লগইন শেল কোথায় সংজ্ঞায়িত করা হয়? ভিতরে/etc/passwd
  • হয় sudo su/ sudo su -/sudo -i / sudo -sএকই? না, তারা সকলেই একটি শেল স্প্যান করে তবে আলাদাভাবে এবং বিভিন্ন প্রসঙ্গে।
  • কি করে $SHELL? আপনার ডিফল্ট শেলটি কেবল একই হিসাবে বলুন /etc/passwd

আসল উত্তর :

প্রথমত, এটি উল্লেখ করা গুরুত্বপূর্ণ যে shoptবাশ-নির্দিষ্ট। উদাহরণস্বরূপ, আমি mkshশেল ব্যবহারকারী, এবং এটি নেইshopt মতো kshনেই , যেমনটি হয় না।

এরপরে, ঠিক login_shellকী উপস্থাপন করার কথা? থেকেman bash :

login_shell

শেলটি এই বিকল্পটি সেট করে যদি লগইন শেল হিসাবে এটি শুরু হয় তবে

এটি মূল বিষয়। sudo -i, আপনি যে আগের উত্তরটি পড়েছেন তা ইতিমধ্যে জানেন, প্রাথমিক লগইন অনুকরণ করার কথা। এজন্য এই বিকল্পের জন্য shoptপ্রতিবেদনগুলি login_shell on। এটি ভাবুন যেন sudo -iশেলটিকে এমন ফাইলগুলির মধ্য দিয়ে যেতে বাধ্য করে যা কেবলমাত্র লগইন প্রক্রিয়া চলাকালীন উপস্থিত হয় (যা ইন্টারেক্টিভ শেল দ্বারা উত্সাহিত হয় না)।

অন্যান্য ক্ষেত্রে, আপনি ইতিমধ্যে শেলের উদাহরণ চালাচ্ছেন, সুতরাং এটি প্রথম স্থানে লগইন শেল হতে পারে না এবং বিকল্পগুলির উদ্দেশ্যটি ভিন্ন। sudo -sকেবলমাত্র পড়তে $SHELL(যা আপনার ডিফল্ট শেলটিকে সেট করার মতো উপস্থাপন করতে বোঝানো হয় /etc/passwd) ভেরিয়েবল এবং এটি রুট সুবিধার সাথে চালায়। এটি করা sudo $SHELLবা sudo mkshবা sudo bash(আপনি যা ব্যবহার করুন) এর সমতুল্য ।

মনে আছে আমি উল্লেখ করেছি যে আমি mkshব্যবহারকারী? এক নজর দেখে নাও:

$ bash --posix
bash-4.3$ sudo -s
[sudo] password for xieerqi: 

DIR:/xieerqi|01:53|skolodya@ubuntu:
$ id 
uid=0(root) gid=0(root) groups=0(root)

DIR:/xieerqi|01:53|skolodya@ubuntu:
$ echo $-
imsU

আপনি যা দেখছেন তা হ'ল এটি আমার শেল sudo -sথেকে লাফিয়ে উঠেছিল , আমি এটির জন্য নির্ধারিত বৈশিষ্ট্যযুক্ত প্রম্পটটি দিয়ে। এবং অবশ্যই, যেহেতু এটি কোনও লগইন অ্যাকশন নয়, কারণ এটি শেলটি অ-লগইন শেল উদাহরণ হিসাবে তৈরি হয়েছে বলে প্রতিবেদন করবে। আমার ক্ষেত্রে যাইহোক, আপনি দেখতে পাচ্ছেন যে সেখানে কোনও চিঠি নেই, যা যদি সেখানে লগইন শেল দৃষ্টান্ত থাকে।bashmkshbash$-l

অবশেষে, একই ধারণাটি প্রযোজ্য sudo suএবং sudo su -। পরে একটি স্প্যান লগইন শেল দৃষ্টান্ত (যেমন লগইন করার জন্য প্রয়োজনীয় নির্দিষ্ট ফাইলগুলি চলবে) এবং প্রাক্তন একগুলি কেবল ইন্টারেক্টিভ শেলগুলি (যেমন লগইন ফাইলগুলি চালিত হয় না) স্প্যান করে।

bash-4.3$ sudo su
[sudo] password for xieerqi: 
root@eagle:/home/xieerqi# shopt login_shell
login_shell     off
root@eagle:/home/xieerqi# exit
bash-4.3$ sudo su -
[sudo] password for xieerqi: 
$ shopt login_shell
login_shell     on

তাই টেকনিক্যালি, shopt login_shellকোনও সম্পর্ক নেই $SHELLসবটা। এটিকে এভাবে ভাবুন: বাশ কীভাবে চলে তা দেখানো এর উদ্দেশ্য ।$SHELLআপনি যা অর্পণ করেছেন কেবল তার প্রতিফলন ঘটানোর কথা /etc/passwd

লগইন শেল এবং নন-লগইন শেলের মধ্যে পার্থক্য হিসাবে, এটি উত্তরের সম্মানিত গিলস এই উত্তরটিতে ইউনিক্স.স্ট্যাকেক্সেঞ্জ ডটকম এ ব্যাখ্যা করেছেন ।


অতিরিক্ত মজা

এখানে আপনি মজাদার কিছু চেষ্টা করতে পারেন। আপনি ইতিমধ্যে জানেন যে একটি লগইন শেল চলবে .profile(এবং .bashrcযেহেতু উবুন্টু এটির .profile জন্য কনফিগার করা আছে ) তবে লগ-ইন না করে কেবল .bashrcফাইল চালানো হবে। সুতরাং আমরা পরীক্ষা করতে পারি echoযে এই কমান্ডগুলির মধ্যে কোনটি একটি লগইন শেল চালায় এবং কোনটি নয় এবং আমরা echoলগইন শেলটির জন্য দুটি লাইন এবং অ-লগইন করার জন্য কেবল একটির প্রত্যাশা করি ।

$ echo "echo 'hi,i am .profile'"  >> .profile
$ echo "echo 'hi, i am .bashrc'" >> .bashrc
$ sudo -i
hi, i am .bashrc
hi,i am .profile
$ sudo su
hi, i am .bashrc
root@eagle:~# sudo su -
hi, i am .bashrc
hi,i am .profile
$ sudo -s
hi, i am .bashrc
root@eagle:~# 

যথাযথভাবে যথেষ্ট, দু'টি লাইনের আউটপুট থাকা লোকেরা login_shellসেট হয়ে যাবে on


আপনাকে ধন্যবাদ সার্জ এবং @ জ্যান্না। এখন সম্পর্কে $SHELLএবং login_shell/non-login_shellস্পষ্ট করা হয়েছে। তবে কোথা থেকে shoptবিস্তারিত পাবেন? এটা echo $0কোথা থেকে ?
প্রডো

1
@ প্রডো আমি হ্যাঁ বলব, যেহেতু প্রথম চরিত্রটি $0শেলটি লগইন শেল কিনা তা নির্ধারণ করতে ব্যবহৃত হয়, সুতরাং যদি shoptসেই পরিবর্তনশীলটি পরীক্ষা করা হয় - তবে অবশ্যই এটি পুরোপুরি গ্রহণযোগ্য। তবে, চোখের দেখা মিলানোর চেয়ে আরও অনেক কিছুই আছে। shoptসম্ভবত এই প্রশ্নের জন্য, আমার একটি শক্ত উত্তর নেই, যেহেতু আমি বাশের সোর্স কোডের সাথে ভালভাবে পরিচিত নই।
সের্গেই কোলোডিয়াজনি

@ প্রাদো বাশ লগইন শেল হিসাবে শুরু হতে পারে হয় $ 0 এর প্রথম অক্ষরটি -ব্যবহার করে বা -lবিকল্পটি ব্যবহার করে ।
مورু

@ প্রাদো আপনি ম্যান পৃষ্ঠায় বাশের অনুরোধ এবং বিকল্পগুলি সম্পর্কে পড়তে পারেন। উদাহরণস্বরূপ শেল বিল্টিন কম্যান্ডের বিভাগটি বলছে login_shell The shell sets this option if it is started as a login shell (see INVOCATION above). The value may not be changed.যাতে shopt login_shellমনে হয় এটি একপেশে বাশ আপনাকে খুঁজে পেতে দেয় - প্রোগ্রাম্যালি কীভাবে এটি কীভাবে শুরু হয়েছিল তা জানতে। অন্য [[ -o login ]]
উপায়টি

11

@Serg ব্যাখ্যা হিসাবে কিভাবে কি শেল আপনি দৌড়াচ্ছে বলতে এই উত্তরে , SHELLপরিবর্তনশীল বর্তমান ব্যবহারকারীর হয় ডিফল্ট শেল থেকে পড়তে যেমন /etc/passwd:

$ grep zanna /etc/passwd
zanna:x:1000:1000:Zanna,,,:/home/zanna:/bin/bash

সুতরাং আমি যদি echo $SHELLএটি সর্বদা ফিরে আসবে /bin/bash:

$ zsh
% echo $SHELL
/bin/bash

থাকুক বা না থাকুক শেল, লগ-ইন শেল হল একটি SH ইএলএল অপ্ট আয়ন সময় শেল শুরু হয় এ নির্ধারিত। শেল প্রোগ্রামটি অন্যান্য সমস্ত সেটিংস এবং ভেরিয়েবলের সাথে এই তথ্য সঞ্চয় করে। shoptকমান্ড একটি উপায় এই তথ্য এবং দেখতে সম্ভব হলে প্রশ্নে বিকল্পের জন্য, সেট অথবা এটা সেট না (উপলব্ধ এই জন্য ঘটনা নাlogin_shell যা, অবশ্যই, শেল শুরু করতে ব্যবহার প্রক্রিয়া উপর নির্ভর করে)

sudoপ্রোগ্রামের অপশন নির্ধারণ কিভাবে রুট শেল এই বিভিন্ন ধরনের শুরু হবে:

এখানে চিত্র বর্ণনা লিখুন


1
ভাল ব্যাখ্যা। আমি মনে করি আপনি যা ব্যাখ্যা করেছেন shoptএবং login_shellআমার উত্তরে এর চেয়ে আরও ভাল উপস্থাপন করার কথা রয়েছে।
সের্গেই কোলোডিয়াজনি

@ সার্জ ধন্যবাদ :) আমি আপনার ব্যাখ্যাটি আরও বিশদভাবে মনে করি :)
জান্না

3

man bash:

লগইন শেল এমন একটি যার আর্গুমেন্ট শূন্যের প্রথম অক্ষর a -বা --loginবিকল্পটি দিয়ে শুরু করা হয়েছে ।

man login:

এর মান $HOME, $SHELL[...] পাসওয়ার্ড এন্ট্রিতে উপযুক্ত ক্ষেত্র অনুযায়ী সেট করা থাকে।

সংক্ষেপে:

  • একটি শেলটি লগইন শেল হয় যদি এটি লগইন শেল হিসাবে ডাকে।
  • এনভায়রনমেন্ট ভেরিয়েবলটি উদাহরণস্বরূপ, আমন্ত্রণমূলক প্রোগ্রাম $SHELLদ্বারা loginবা দ্বারা সেট করা হয় su। শেল নিজেই এটি সেট করে না।
  • shopt বর্তমানে কার্যকর শেল বিকল্পগুলি দেখায়।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.