ইন্টারেক্টিভ নয় এমন লগইন শেল থাকা কি সেখানে সম্ভব?


11

এই ফ্লোচার্টের ব্যাখ্যায়

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

আমি খুঁজে পেয়েছি যে মানুষের বাশ:

যখন বাশকে একটি ইন্টারেক্টিভ লগইন শেল হিসাবে, বা - লোগিন বিকল্পের সাথে একটি অ-ইন্টারেক্টিভ শেল হিসাবে ডাকা হয়, এটি প্রথমে ফাইল / ইত্যাদি / প্রোফাইল থেকে কমান্ডগুলি পড়ে এবং কার্যকর করে, যদি সেই ফাইলটি বিদ্যমান থাকে।

এতে বলা হয়েছে যে ইন্টারেক্টিভ লগইন শেলগুলি /etc/profile(--noprofile ছাড়াই) পড়া

এছাড়াও, বিকল্পটি পড়ার সাথে অ-ইন্টারেক্টিভ শেল--login/etc/profile

এটি মনে হয় কিছু সম্ভাব্য লগইন শেলগুলি (যার $0সাথে ক দিয়ে শুরু হয় -) যে অ-ইন্টারেক্টিভ হচ্ছে (কোনও স্ক্রিপ্ট চালান, সম্ভবত সহজ date) পড়তে পারে না (উত্স) /etc/profile

এই ধারণাটি নিশ্চিত বা অস্বীকার করতে:

প্রথমে আমি ব্যবহারের চেষ্টা করেছি su -l -, যা -প্রথম অক্ষর হিসাবে একটি লগইন শেল শুরু করে তবে আমি এটি অ-ইন্টারেক্টিভ করতে ব্যর্থ হয়েছি (এবং এটি অনুসন্ধানের জন্য পরীক্ষাগুলি উপস্থাপন করতে সক্ষম হব)।

এরকম কিছু ডাকছে

$ bash -c 'date' -bash

লগইন শেল হিসাবে প্রতিবেদন করে না (এমনকি প্রথম অক্ষরটি একটি হলেও -)।

বিস্তারিত প্রকাশ করার জন্য এটি চেষ্টা করুন:

   $ bash -c 'echo "$0 $- ||$(shopt -p login_shell)||";date' -bash
      -bash hBc ||shopt -u login_shell||
      Fri Aug 19 06:32:31 EDT 2016

$0একটি আছে -প্রথম অক্ষর যেমন, কোন iমূল্য (ইন্টারেক্টিভ) $-কিন্তু এটি একটি নয় বলে প্রতিবেদন করা হয় login_shell(-u)। এই ক্ষেত্রে, / ইত্যাদি / প্রোফাইলটি পড়েনি, তবে আমি নিশ্চিত নই যে এটি সঠিক পরীক্ষা।


এই প্রশ্নের জন্য যথেষ্ট নির্দিষ্ট না করে এই উত্তরে "বিরল অ-ইন্টারেক্টিভ লগইন শেলস" এর উল্লেখ রয়েছে।


এই লোক শেষে যে /etc/profileসবসময় পড়া হয়।

সংক্ষিপ্ত তালিকাটি পড়ুন: ইন্টারেক্টিভ এবং অ-ইন্টারেক্টিভ লগইন শেলগুলি উভয়ই পড়ুন /etc/profile


এবং, যদি এই পৃষ্ঠাটির উদাহরণগুলি সঠিক হয়:

Some examples

$ su bob                   # interactive non-login shell
$ su - bob                 # interactive login shell
$ exec su - bob            # interactive login shell
$ exec su - bob -c 'env'   # non-interactive login shell
$ ssh bob@example.com      # interactive login shell, `~/.profile`
$ ssh bob@example.com env  # non-interactive non-login shell, `~/.bashrc`

exec su - bob -c 'env'প্রতিবেদনগুলির পরীক্ষা যা /etc/profileপড়েছিল।


সংক্ষেপে:

একটি অ-ইন্টারেক্টিভ লগইন শেল ( - লগিন বা -l দিয়ে বলা হয় না) পাওয়া কি সম্ভব?

এবং যদি সত্য হয়, এটি /etc/profileফাইলটি পড়ছে ?

উপরেরটি সত্য হলে আমাদের উপসংহারে পৌঁছে যেতে হবে যে সমস্ত লগইন শেলগুলি [ইন্টারেক্টিভ (বা না)] পড়ুন / ইত্যাদি / প্রোফাইল (কোনও --noprofileবিকল্প নেই)।

দ্রষ্টব্য: / etc / প্রোফাইলটি পড়ছে তা সনাক্ত করতে, এই কমান্ডটি ফাইলের একেবারে শুরুতে যুক্ত করুন:

echo "'/etc/profile' is being read"

উত্তর:


2

একটি ইন্টারঅ্যাক্টিভ লগইন শেল অস্বাভাবিক, তবে সম্ভব possible যদি আপনি শেরটি জিরোথ আর্গুমেন্ট দিয়ে শুরু করেন (যা সাধারণত কার্যকরভাবে নাম কার্যকর হয়) এর সাথে একটি স্ট্রিং সেট করে -, এটি একটি লগইন শেল, এটি ইন্টারেক্টিভ হোক বা না হোক।

$ ln -s /bin/bash ./-bash
$ echo 'shopt -p login_shell; echo $-' | HOME=/none PATH=.:$PATH -bash
shopt -s login_shell
hB

আপনার প্রচেষ্টা কার্যকর bash -c date -bashহয়নি কারণ এটি শেলটিকে লগইন শেল হতে বলে না: জেরোথ আর্গুমেন্টটি bashনয় -bash। ব্যাশ শুরু হওয়ার পরে, এটা পরিবর্তনশীল সেট করে $0করতে -bashzeroth যুক্তি পরিবর্তে, কিন্তু zeroth যুক্তি আসলে একটি হয়।

আপনি su -lবা এর সাথে একটি অবিচ্ছিন্ন লগইন শেল চালাতে পারেন su -, তবে আপনাকে অনুমোদিত হতে সক্ষম হওয়ার পরেও স্ট্যান্ডার্ড ইনপুটটি টার্মিনাল না হওয়ার ব্যবস্থা করতে হবে (কোনও পাসওয়ার্ড টাইপ না করে, বা পাসওয়ার্ডটি শুরুতে হওয়ার ব্যবস্থা না করে) ইনপুট). এটি sudo দিয়ে আরও সহজ হতে পারে: sudo trueউপস্থিতি শংসাপত্র পাওয়ার জন্য চালান , তারপরে শংসাপত্রটি বৈধ রান হওয়ার পরেও echo 'shopt -p login_shell; echo $-' | sudo -i

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


4

আমি গ্রাফিকাল লগইন পরিবেশ দেখেছি যা এটি করে:

exec "$SHELL" -l -c 'exec start-window-or-session-manager'

বা এর সমতুল্য:

exec -a "-$SHELL" "$SHELL" <<EOF
exec start-window-or-session-manager
EOF

যাতে সেশন ইনিশিয়েশন ফাইলটি (যেমন ~/.profileবোর্নের মতো শেলগুলির জন্য (এবং কিছুটির সাথে সংশ্লিষ্টগুলি /etc)) পড়ে এবং প্রয়োগ করা যায়।

প্রথমটি সমস্ত শেল দিয়ে কাজ করে না। -lপ্রচুর শাঁস দ্বারা সমর্থিত, তবে সমস্ত নয় এবং কিছুতে যেমন csh/ যেমন tcshব্যবহার করা যায় না -cargv[0]সত্তার প্রথম চরিত্রটি -সমস্ত শাঁস দ্বারা বোঝা যায় যদিও loginসেগুলি শেলগুলি লগইন শেলগুলি বোঝাতে ব্যবহার করে।

দ্বিতীয় ক্ষেত্রে, সেই শেলের স্টিডিনটি কোনও ttyডিভাইস ছাড়া অন্য কিছু ( <<শেমের উপর নির্ভর করে একটি অস্থায়ী নিয়মিত ফাইল, বা পাইপ দ্বারা প্রয়োগ করা হয়), সুতরাং শেলটি ইন্টারেক্টিভ হয় না (যখন মানুষের ইন্টারেক্টিভ হয় তখন ইন্টারেক্টিভ সত্ত্বার সংজ্ঞা হয়) এর সাথে).


প্রথমটি --loginবিকল্পটি ব্যবহার করছে । দ্বিতীয়টির জন্য, আমি যদি পাই exec -a "-bash" "bash" <<<"shopt -p login_shell; echo $0 $-"(সি কোয়েটে এনকোডড) $'/etc/profile read\nshopt -s login_shell\nbash himBH'তাই, এটি লগইন হয় তবে এটি ইন্টারেক্টিভ। আমাদের লগইন এবং অ-ইন্টারেক্টিভ দরকার । আমি কী মিস করছি এটি?

@sorontar সঙ্গে <<<"$-", যে $-কারণ ডবল কোট কলিং শেল দ্বারা প্রসারিত করা হয়। তথাকথিত শেলটি ইন্টারেক্টিভ নয় কারণ এর স্ট্ডিনটি টিটিআই নয়।
স্টাফেন চেজেলাস

আহ, হ্যাঁ, আপনি ঠিক বলেছেন, স্যার। তবে, ভুলটি সংশোধন করে আমরা এটি করতে পারি: exec -a "-bash" "bash" <<\EOF shopt -p login_shell; echo $0 $- EOFএই নিশ্চয়তাটি পেতে: $'/etc/profile read stdin: is not a tty shopt -s login_shell -bash hB'সুতরাং, হ্যাঁ, একটি ইন্টারেক্টিভ লগইন শেলটি সম্ভব, এবং এটি এখনও পড়ে /etc/profile। সমস্ত লগইন শেলগুলি কি আমাদের পড়া উচিত /etc/profile?

ksh এটি অত্যন্ত পরিষ্কার করে দেয় যে এটি একটি ইন্টারঅ্যাক্টিভ লগইন শেল , চেষ্টা করে দেখুন exec -a "-ksh" "ksh" <<\EOF echo $0; set -o EOF)।

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

3

হ্যাঁ, অ-ইন্টারেক্টিভ লগইন শেলগুলি সম্ভব

$ head -1 /etc/profile
echo PROFILE BEING READ

$ echo echo hello | su -
PROFILE BEING READ
stdin: is not a tty
hello

$

এটি এই সরলীকৃত: এর অনুরূপ su -c 'echo hello' -। কোনটি, আমাদের যা যা পরীক্ষা করা দরকার তা su -c 'echo $0 $-; shopt -p login_shell' -এই হিসাবে লেখা উচিত: এই নিশ্চিতকরণ উত্তরটি পেতে (সি উদ্ধৃতিতে এনকোডেড) : $'/etc/profile read \n -su hBc \n shopt -s login_shell'. এটি নিশ্চিত করে যে একটি লগইন অ-ইন্টারেক্টিভ শেল উত্তেজিত ছিল এবং প্রক্রিয়াটিতে, / ইত্যাদি / প্রোফাইলটি পড়েছিল। ধন্যবাদ।

0

একটি অ-ইন্টারেক্টিভ লগইন শেল (- লগিন বা -l দিয়ে বলা হয় না) পাওয়া কি সম্ভব?

হ্যাঁ.

$ (exec -a '-' bash -c 'shopt -q login_shell && echo login shell')

তবে নোট করুন যে আর্গুমেন্টটি /etc/profileনা --loginদেওয়া থাকলে একটি অ-ইন্টারেক্টিভ লগইন শেলের জন্য ব্যবহৃত হবে না ।

অ-ইন্টারেক্টিভ লগইন শেলটির অনুরোধ করে এমন একটি সাধারণ প্রতিমা:

$ su - someuser -c somecommand

তবে এটি /etc/profileবাস্তবায়িত হয় না এমনটি ভোগ করে ।

এই আচরণটি পরিবর্তন করা সম্ভব তবে এটির মধ্যে কনফিগার-টোপ-এ পাওয়া বিকল্প অপ্রয়োজনীয় করে কম্পাইল-টাইমে বাশ সোর্স কোডটি কাস্টমাইজ করা জড়িত :

/* Define this to make non-interactive shells begun with argv[0][0] == '-'
run the startup files when not in posix mode. */
/* #define NON_INTERACTIVE_LOGIN_SHELLS */

যখন আমি এই গবেষণা suঅনিয়ম , আমি অন্তর্গত যে অন্যান্য শাঁস পাওয়া zshএবং dashএই অমিল হবে না।

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