লগইন শেল এবং নন-লগইন শেলের মধ্যে পার্থক্য?


317

আমি ইন্টারেক্টিভ শেল এবং একটি অ-ইন্টারেক্টিভ শেলের মধ্যে প্রাথমিক পার্থক্যটি বুঝতে পারি। লগ-ইন শেল থেকে লগইন শেলটি ঠিক কী পার্থক্য করে?

লগ-ইন না করা ইন্টারেক্টিভ শেল ব্যবহারের জন্য আপনি উদাহরণ দিতে পারেন ?


45
আমি মনে করি যে প্রশ্নটি আরও ভালভাবে বর্ণিত হয়েছে " লগইন এবং নন-লগইন শেলগুলিকে আলাদা করার জন্য আমাদের কেন করণীয় / করা উচিত?" ওয়েবে অনেক জায়গাগুলি ইতিমধ্যে আমাদের জানায় যে প্রতিটি স্টার্টআপ ফাইলগুলি কী পড়বে; তবে তাদের মধ্যে কেউই সন্তোষজনক এবং দৃinc়প্রত্যয়ীভাবে "কেন" এর উত্তর দেয় বলে মনে হয় না। উদাহরণ মামলা ব্যবহার যেখানে আপনি স্পষ্টভাবে চাই না এক বা অন্যান্য আচরণ মহান হতে হবে।
কাল

2
@ কাল এটি একটি আলাদা প্রশ্ন হতে হবে, যেহেতু এখানে কোনও উত্তর আসলে এটি অন্তর্ভুক্ত করে না। সম্পাদনা: বাস্তবে, এটি এখানে: নন-লগইন শেলের উপর একটি লগইন শেল কেন ?
স্কিপি লে গ্র্যান্ড গৌরু

উত্তর:


304

লগইন শেল হ'ল প্রথম প্রক্রিয়া যা আপনার ব্যবহারকারী আইডির আওতায় কার্যকর হয় যখন আপনি কোনও ইন্টারেক্টিভ সেশনে লগ ইন করেন। লগইন প্রক্রিয়া শেলটিকে একটি কনভেনশন সহ লগইন শেল হিসাবে আচরণ করতে বলে: পাসিং আর্গুমেন্ট 0, যা সাধারণত শেলটির নাম, একটি -অক্ষর প্রিপেন্ড করা থাকে (যেমন -bashএটি সাধারণত হবে bashLogin লগইন শেলগুলি সাধারণত একটি ফাইল পড়ে এনভায়রনমেন্ট ভেরিয়েবল সেট করার মতো জিনিস: /etc/profileএবং ~/.profiletheতিহ্যবাহী বোর্ন শেল, ~/.bash_profileঅতিরিক্তভাবে বাশ , /etc/zprofileএবং ~/.zprofilezsh for , /etc/csh.loginএবং ~/.logincsh ইত্যাদির জন্য etc.

আপনি যখন কোনও পাঠ্য কনসোলে লগ ইন করেন বা এসএসএইচ এর মাধ্যমে বা এর মাধ্যমে su -, আপনি একটি ইন্টারেক্টিভ লগইন শেল পাবেন। আপনি যখন গ্রাফিকাল মোডে লগ ইন করেন ( এক্স এক্স ম্যানেজারে ) তখন আপনি লগইন শেল পাবেন না, পরিবর্তে আপনি সেশন ম্যানেজার বা উইন্ডো ম্যানেজার পাবেন।

একটি অ-ইন্টারেক্টিভ লগইন শেলটি চালানো বিরল , তবে কিছু এক্স সেটিংস এমনটি করে যা আপনি যখন কোনও ডিসপ্লে ম্যানেজারের সাথে লগ ইন করেন তখন প্রোফাইল ফাইলগুলি পড়ার ব্যবস্থা করতে পারেন। অন্যান্য সেটিংস (এটি ডিস্ট্রিবিউশনের উপর এবং ডিসপ্লে ম্যানেজারের উপর নির্ভর করে) পড়ুন /etc/profileএবং ~/.profileস্পষ্টভাবে পড়ুন বা সেগুলি পড়বেন না। আরেকটি উপায় একটি অ-ইন্টারেক্টিভ লগ-ইন শেল পেতে একটি কমান্ড স্ট্যান্ডার্ড ইনপুট মাধ্যমে গৃহীত টার্মিনাল, যেমন নয় সঙ্গে দূরবর্তী অবস্থান থেকে লগ ইন করার নেই ssh example.com <my-script-which-is-stored-locally(উল্টোদিকে ssh example.com my-script-which-is-on-the-remote-machine, যা একটি নন-ইন্টারেক্টিভ, অ-লগইন শেল চালায়)।

আপনি যখন একটি বিদ্যমান সেশনে টার্মিনালে একটি শেল শুরু করেন (স্ক্রিন, এক্স টার্মিনাল, ইমাকস টার্মিনাল বাফার, অন্যের মধ্যে একটি শেল ইত্যাদি), আপনি একটি ইন্টারেক্টিভ, লগ-ইন না করে শেল পাবেন get যে শেল শেল কনফিগারেশন ফাইল (পড়তে পারে ~/.bashrcব্যাশ যেন বরকত জন্য bash, /etc/zshrcএবং ~/.zshrczsh জন্য, /etc/csh.cshrcএবং ~/.cshrccsh শেল জন্য, ফাইল দ্বারা নির্দেশিত ENVযেমন ড্যাশ, ksh এবং ব্যাশ যেমন POSIX / XSI-অনুবর্তী শাঁস জন্য পরিবর্তনশীল যখন যেমন প্রার্থনা sh, $ENVযদি সেট এবং ~/.mkshrcম্যাক্স ইত্যাদির জন্য)।

যখন শেলটি তার কমান্ড লাইনে একটি স্ক্রিপ্ট বা একটি কমান্ডটি চালিত করে, এটি একটি অ-ইন্টারেক্টিভ, লগইনবিহীন শেল। এই ধরনের শাঁস সর্বদা চলতে থাকে: এটি খুব সাধারণ যে কোনও প্রোগ্রাম যখন অন্য প্রোগ্রামকে কল করে তখন এটি অন্য প্রোগ্রামটি চালানোর জন্য শেলের মধ্যে একটি ছোট স্ক্রিপ্ট চালায়। কিছু শেল এই ক্ষেত্রে একটি স্টার্টআপ ফাইল পড়ে (ব্যাশ BASH_ENVভেরিয়েবল দ্বারা নির্দেশিত ফাইলটি চালায় , zsh রান করে /etc/zshenvএবং ~/.zshenv) তবে এটি ঝুঁকিপূর্ণ: শেলটি সমস্ত প্রসঙ্গে প্রেরণ করা যেতে পারে, এবং এমন কিছু খুব কমই করতে পারে যা আপনি নাও করতে পারেন কিছু ভাঙ্গা

আমি কিছুটা সরলীকরণ করছি, মজাদার বিশদগুলির জন্য ম্যানুয়ালটি দেখুন।


2
আপনি কী উদাহরণ দিতে পারেন কীভাবে bashএকটি অ-ইন্টারেক্টিভ লগইন শেল হিসাবে চালাবেন ?
পাইওটর ডব্রোগোস্ট

13
@ পাইওটারডব্রোগস্টecho $- | bash -lx
গিলস

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

4
@ কেভিনহিলার ওএসএক্স-এ, ডিফল্টরূপে, টার্মিনাল অ্যাপ্লিকেশনটি একটি লগইন শেল চালায়। (আমি যেমন বর্ণনা করেছি, শেলটি শুরু হওয়া প্রোগ্রামটি শেলটি লগইন শেল হিসাবে কাজ করে কিনা তা স্থির করে)) এটি কাজ করার স্বাভাবিক উপায় নয়।
গিলস

2
@ আইএএমজুলিয়ানআকোস্টা যদি FOOপরিবেশের পরিবর্তনশীল হয় (যেমন .profileথাকে export FOO=something) তবে এটি সহ সমস্ত উপ-প্রসেসের জন্য উপলব্ধ foo.sh। আপনি যদি এতে পরিবর্তন .profileকরেন export FOO=something_elseতবে পরের বার আপনি লগইন না হওয়া পর্যন্ত ./foo.shমুদ্রণ করবেনsomething
গিলস

48

আপনি লগইন শেলটিতে আছেন কিনা তা জানাতে:

prompt> echo $0
-bash # "-" is the first character. Therefore, this is a login shell.

prompt> echo $0
bash # "-" is NOT the first character. This is NOT a login shell.

বাশ-এ আপনি ব্যবহার করতে পারেন shopt login_shell:

prompt> shopt login_shell
login_shell     off

(বা onলগইন শেল এ)।

তথ্য পাওয়া যাবে man bash(অনুরোধ অনুসন্ধান)। এখানে একটি অংশ:

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

আপনি নিজে এটি পরীক্ষা করতে পারেন। যে কোনও সময় আপনি এসএসএইচ করুন, আপনি লগইন শেলটি ব্যবহার করছেন। উদাহরণ স্বরূপ:

prompt> ssh user@localhost
user@localhost's password:
prompt> echo $0
-bash

লগইন শেল ব্যবহারের গুরুত্ব হ'ল এতে যে কোনও সেটিংস /home/user/.bash_profileকার্যকর হবে। আপনি যদি আগ্রহী হন তবে এখানে আরও কিছু তথ্য দেওয়া হয়েছে (থেকে man bash)

"যখন বাশকে একটি ইন্টারেক্টিভ লগইন শেল হিসাবে, বা - লোগিন বিকল্পের সাথে একটি অ-ইন্টারেক্টিভ শেল হিসাবে ডাকা হয়, এটি প্রথমে ফাইল / ইত্যাদি / প্রোফাইল থেকে কমান্ডগুলি পড়ে এবং কার্যকর করে, যদি সেই ফাইলটি উপস্থিত থাকে that ফাইলটি পড়ার পরে, এটি জন্য দেখায় ~/.bash_profile, ~/.bash_loginএবং ~/.profile, যাতে, এবং পড়ে এবং প্রথম এক যে বিদ্যমান এবং পাঠযোগ্য। --noprofile বিকল্পটি শেল এই আচরণ দমন করা শুরু হয় ব্যবহার করেছিলেন তার থেকে কমান্ড executes। "


23

একটি লগইন শেল argv[0][0] == '-',। এটি এটি কীভাবে জানে এটি লগইন শেল।

এবং তারপরে কিছু পরিস্থিতিতে এটি এর "লগইন শেল" স্থিতির উপর নির্ভর করে আলাদা আচরণ করে। যেমন একটি শেল, এটি লগইন শেল নয়, "লগআউট" কমান্ড চালায় না।


4
অনুসারে man bash, জোর দিয়ে যোগ করা হয়েছে, "একটি লগইন শেল এমন একটি যার আর্গুমেন্টের প্রথম অক্ষরটি হ'ল - বা লগিন বিকল্প দিয়ে শুরু করা হয়েছে। "
ওয়াইল্ডকার্ড

18

জিইউআইতে একটি নতুন টার্মিনালে শুরু হওয়া শেলটি ইন্টারেক্টিভ অ-লগইন শেল হবে। এটি আপনার .bashrc উত্স করবে, তবে আপনার। প্রোফাইল নয়।


4

আমি লগইন শেল প্রকারটি পরীক্ষা করার জন্য টিমোথির পদ্ধতির সাথে মিলিয়ে গিলসের দুর্দান্ত উত্তরের বিস্তারিত বর্ণনা করব।

আপনি যদি নিজের জন্য জিনিস দেখতে চান তবে স্নিপেটগুলি এবং দৃশ্যের নমুনা চেষ্টা করুন।

শেল (অ-) ইন্টারেক্টিভ কিনা তা পরীক্ষা করা হচ্ছে

if tty -s; then echo 'This is interactive shell.'; else echo 'This is non-interactive shell.'; fi

শেলটি (অ-) লগইন কিনা তা পরীক্ষা করা হচ্ছে

যদি আউটপুটটি echo $0শুরু হয় তবে -এটি লগইন শেল ( echo $0আউটপুট উদাহরণ -bash:)। অন্যথায় এটি লগ-ইন শেল ( echo $0আউটপুট উদাহরণ bash:)।

if echo $0 | grep -e ^\- 2>&1>/dev/null; then echo "This is login shell."; else echo "This is non-login shell."; fi;

উভয় টুকরোগুলি একসাথে পাওয়ার জন্য উপরের দুটি সাথে একত্রিত করা যাক:

THIS_SHELL_INTERACTIVE_TYPE='non-interactive'; 
THIS_SHELL_LOGIN_TYPE='non-login'; 
if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi; 
if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi;
echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"

প্রেক্ষাপটে:

বিশেষ বিকল্প ছাড়াই সাধারণ এসএসএইচ সেশন

ssh ubuntu@34.247.105.87
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-1083-aws x86_64)

ubuntu@ip-172-31-0-70:~$ THIS_SHELL_INTERACTIVE_TYPE='non-interactive';
ubuntu@ip-172-31-0-70:~$ THIS_SHELL_LOGIN_TYPE='non-login';
ubuntu@ip-172-31-0-70:~$ if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi;
ubuntu@ip-172-31-0-70:~$ if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi;
ubuntu@ip-172-31-0-70:~$ echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"

interactive/login

স্ক্রিপ্ট চালাচ্ছেন বা নতুন শেলের মাধ্যমে স্পষ্টত সম্পাদন করছেন

ubuntu@ip-172-31-0-70:~$  bash -c 'THIS_SHELL_INTERACTIVE_TYPE='non-interactive'; THIS_SHELL_LOGIN_TYPE='non-login'; if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi; if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi; 
echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"'

interactive/non-login

স্থানীয় স্ক্রিপ্ট দূরবর্তীভাবে চলমান

ssh ubuntu@34.247.105.87 < checkmy.sh
Pseudo-terminal will not be allocated because stdin is not a terminal.
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-1083-aws x86_64)

non-interactive/login

দূরবর্তীভাবে ssh ওপরে একটি কমান্ড চালানো

ssh ubuntu@34.247.105.87 'THIS_SHELL_INTERACTIVE_TYPE='non-interactive'; THIS_SHELL_LOGIN_TYPE='non-login'; if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi; if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi; echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"'

non-interactive/non-login

-tস্যুইচ সহ দূরবর্তীভাবে ssh ওপরে একটি কমান্ড চালানো

আপনি -tস্যুইচ ব্যবহার করে দূরবর্তীভাবে কমান্ড চালাতে চাইলে আপনি স্পষ্টতই ইন্টারেক্টিভ শেলটি অনুরোধ করতে পারেন।

ssh ubuntu@34.247.105.87 -t 'THIS_SHELL_INTERACTIVE_TYPE='non-interactive'; THIS_SHELL_LOGIN_TYPE='non-login'; if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi; if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi; echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"'

interactive/non-login

দ্রষ্টব্য: বিষয় উপর কেন কমান্ড দূরবর্তী অবস্থান থেকে চলমান নয় login shellআরও তথ্য এখানে

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