আমার এলডি_লিবিআরএআইপিএইচটি কেন আনসেট লঞ্চ টার্মিনালটি পায়?


8

কিছু পরিবেশের ভেরিয়েবল সেট আপ করতে এবং যুক্তি হিসাবে আমি যে কোনও প্রোগ্রাম প্রেরণ করি তা চালু করার জন্য আমার কাছে শেল স্ক্রিপ্ট রয়েছে:

export PATH=$HOME/local/bin:$PATH
export LD_LIBRARY_PATH=$HOME/local/lib:$LD_LIBRARY_PATH
export TESTER="MY TEST VAR"

$@

যখন আমি bashএটি কল করার জন্য এটি ব্যবহার করি উদাহরণস্বরূপ এটি কাজ করে:

kjfletch@flatbed:~$ envrun.sh bash
kjfletch@flatbed:~$ echo $LD_LIBRARY_PATH
/home/kjfletch/local/lib:
kjfletch@flatbed:~$ echo $TESTER
MY TEST VAR

যখন আমি এটা ব্যবহার প্রান্তিক ডাকতে ( xterm, aterm, ...) আমার LD_LIBRARY_PATHসেট না পায়:

kjfletch@flatbed:~$ echo $LD_LIBRARY_PATH

kjfletch@flatbed:~$ echo $TESTER

MY TEST VAR

কেন এমন হয়? আমি কীভাবে এটি বন্ধ করতে পারি? (আমি ডেবিয়ান 5.0 চালাচ্ছি)

হালনাগাদ

আমার টার্মিনালটি ব্যাশটিকে লগইন হিসাবে কল করছে না:

kjfletch@flatbed:~$ echo $0
bash

আমার LD_LIBRARY_PATHকোনও ব্যাশ স্টার্টআপ ফাইলগুলিতে প্রদর্শিত হবে না (.bash_history এবং ~ /। প্রোফাইলের অস্তিত্ব নেই)):

kjfletch@flatbed:~$ grep "LD" ~/.bash*
kjfletch@flatbed:~$ grep "LD" /etc/bash.bashrc 
kjfletch@flatbed:~$ grep "LD" /etc/profile 

সেই সূচনা ফাইলগুলির মধ্যে কি কোনও "উত্স" কমান্ড বা "" কল করে? অন্যান্য স্টার্টআপ স্ক্রিপ্ট আনতে কমান্ড? যদি তা হয় তবে তাদের মধ্যে একজন অপরাধীও হতে পারেন।
কেভিন প্যাঙ্কো

আপনার প্রশ্নের উত্তর দেয় না, তবে সত্যিই ভাল জিনিসটি হ'ল এলডি_লিবারি_প্যাথের প্রয়োজনীয়তা থেকে মুক্তি (কারণগুলি: 1 2 3 )। আপনি উদাহরণস্বরূপ, /etc/ld.so.conf সম্পাদনা করতে বা আপনার ~ / লোকাল-এ থাকা ব্যবহারকারী-সংজ্ঞায়িত libs একটি উপায়ে সংকলন করতে পারেন যাতে তারা জানেন যে তাদের লাইব্রেরিগুলি কোথায় পাবেন (আমি যে লিঙ্কগুলি দিয়েছি তা দেখুন)।
দেবসোলার

উত্তর:


9

টার্মিনাল বাইনারি setgidগ্রুপ হওয়ার সম্ভাবনা সবচেয়ে বেশি utmpLD_LIBRARY_PATHসুরক্ষার কারণে সেতুড এবং সেটগিড বাইনারিগুলি আনসেট করে না ; দেখুন ld.so(8):

প্রোগ্রামটির জন্য প্রয়োজনীয় প্রয়োজনীয় ভাগ করা লাইব্রেরিগুলি নিম্নলিখিত ক্রমে অনুসন্ধান করা হয়

  • পরিবেশ পরিবর্তনশীল LD_LIBRARY_PATH( LD_AOUT_LIBRARY_PATHa.out প্রোগ্রামের জন্য) ব্যবহার করে । যদি এক্সিকিউটেবলটি সেটুইড / সেটজিড বাইনারি হয় তবে এই ক্ষেত্রে এটি উপেক্ষা করা হবে।

4

টার্মিনালে (xterm, aterm ইত্যাদি) শেলটি কীভাবে চাওয়া হয়েছে তা পরীক্ষা করুন: একটি লগইন শেল "-বাশ" প্রদর্শন করবে এবং যখন আপনি কল করবেন তখন একটি লগ-ইন শেল "বাশ" প্রদর্শন করবে echo $0

$ echo $0
-bash
$ bash
$ echo $0
bash

একটি লগইন ব্যাশ শেল নিম্নলিখিত ক্রমটি পড়বে:

  1. জন্য / etc / প্রফাইল
  2. ~ / .Bash_profile
  3. ~ / .Bash_login
  4. ~ / .Profile

এই ফাইলগুলির মধ্যে কোনও উপস্থিত রয়েছে কিনা এবং সেগুলি ভেরিয়েবলটি পুনরায় সেট করে কিনা তা পরীক্ষা করে দেখুন। এই ফাইলগুলির মধ্যে যে কোনও ফাইল আপনাকে অন্তর্ভুক্ত করতে হবে।

যদি ব্যাশটি লগইন শেল হিসাবে না ডাকা হয়, তবে এটি ইন্টারেক্টিভ শেল হিসাবে নির্ধারিত হলে এটি নীচের ফাইলগুলি পড়বে।

  1. /etc/bash.bashrc
  2. ~ / .Bashrc

যে ধরণের ব্যাশ শেলটি চাওয়া হচ্ছে তা নির্ধারণ করার একটি সহজ উপায় হ'ল আপনার .bash_profile এবং .bashrc সংজ্ঞায়িত করা এবং যথাক্রমে "লগইন শেল" এবং "ইন্টারেক্টিভ শেল" প্রতিধ্বনি করা।

একবার আপনি কীভাবে শেলটি ডাকা হচ্ছে তা জানার পরে, আপনার হোম ডিরেক্টরিতে আপনার স্ক্রিপ্টটি .bashrc বা .bash_profile ফাইলটিতে যুক্ত করার বিকল্প রয়েছে। বিকল্পভাবে, আপনি LD_LIBRARY_PATH এর রিসেটটি অক্ষম করতে পারেন।

মনে রাখবেন যে আপনার .bashrc বা .bash_profile নীচের মত একটি প্রহরী দ্বারা সুরক্ষিত থাকলে, আপনাকে এর বাইরেও স্ক্রিপ্ট কল করতে হতে পারে:

if [ "X$BASH_SOURCED" != "XYES" ]; then
        export BASH_SOURCED=YES

fi

কোনও স্ক্রিপ্টটি এক সেশনে একাধিকবার উত্সাহিত করা রোধ করার জন্য সাধারণত এই জাতীয় রক্ষীদের রাখা হয়।

সম্পাদনা করুন: যদি ভেরিয়েবলটি পুনরায় সেট করা হচ্ছে তা ট্র্যাকিয়াস হিসাবে সনাক্ত করা হয় এবং উদাহরণস্বরূপ আপনার কাছে / ইত্যাদি / প্রোফাইল বা /etc/bash.bashrc অ্যাক্সেস রয়েছে তবে আপনি অস্থায়ীভাবে শীর্ষের নিকটে "সেট-এক্স" যুক্ত করতে পারেন সম্পাদিত সমস্ত কমান্ড দেখতে স্ক্রিপ্ট। আউটপুটটি বেশ ভার্বোজ হবে, সুতরাং প্রথমে আপনার শেলের মধ্যে একটি "সেট-এক্স" করুন এবং কয়েকটি কমান্ড চালান যাতে আপনি কী আশা করতে পারেন তা জানেন।


+1 তথ্যের জন্য ধন্যবাদ। আপনার উত্তরের জবাবে আমি আমার ওপি আপডেট করেছি।
kjfletch

আপনি যদি একই টার্মিনালে বাশ টাইপ করে একটি নতুন ব্যাশ শেল প্রবেশ করেন তবে আপনি কি একই আচরণ দেখছেন? বিটিডব্লু, আপনার /etc/bash.bashrc এবং / etc / প্রোফাইলের মধ্যে থেকে কল করা ফাইলগুলিও পরীক্ষা করতে হবে - এর মধ্যে একটি ভেরিয়েবল আনসেট করতে পারে। বিকল্পভাবে, set -xশেল তৈরির সময় থেকে সম্পন্ন হওয়া সমস্ত কিছুর ডাম্প পেতে ডিবাগ বিকল্পটি ব্যবহার করুন ।

set -xডাম্প LD_LIBRARY_PATH কোন উল্লেখ করে না। ফ্যান্টম আনসেট করুন।
kjfletch

4

এটি কীভাবে শুরু হয় তার উপর নির্ভর করে ব্যাশ বিভিন্ন স্টার্ট আপ স্ক্রিপ্ট ব্যবহার করবে। এটি শুরু করার জন্য সাতটি ভিন্ন উপায় রয়েছে তবে সর্বাধিক গুরুত্বপূর্ণ হ'ল লগইন শেল বনাম লগ-ইন ইন্টারেক্টিভ শেল।

পরীক্ষা করে দেখুন ব্যাশ ম্যানুয়াল আরো বিস্তারিত জানার জন্য। আমি সন্দেহ করব যে / ইত্যাদি / প্রোফাইল বা ~ / .Bash_profile এলডি_লিবারি_প্যাটিএইচ ভেরিয়েবলটি পুনরায় সেট করতে কিছু করছে।


সম্পাদনা: আমি মনে করি আপনি যে যুক্তিসঙ্গতভাবে LD_LIBRARY_PATH আনসেট করে এমন কোনও প্রারম্ভিক স্ক্রিপ্ট নেই তা দেখানোর জন্য আপনি যথাসম্ভব যথাসাধ্য চেষ্টা করেছেন। সময় এসেছে বড় বন্দুকগুলি বের করে আনার।

প্রতিটি প্রক্রিয়া শুরু হওয়ার সাথে সাথে বাশ থেকে শুরু করে এক্সটার্ম পর্যন্ত নিচের কমান্ডটি পুরো পরিবেশটি প্রদর্শন করবে এবং এতে জড়িত যা ঘটবে - আপনি সম্ভবত প্রচুর পরিমাণে আউটপুট পাবেন, সুতরাং একটি ফাইলে আউটপুট সংরক্ষণ করা ভাল ধারণা ।

strace -v -f -e trace=process -o strace_output.txt envrun.sh xterm

এখন, স্ট্রেস_আউটপুট.txt ফাইলটি আপনার স্ক্রিপ্ট এবং প্রতিটি শিশু প্রক্রিয়া দ্বারা নির্মিত প্রতিটি সিস্টেম কল প্রদর্শন করবে এবং এটি সরিয়ে নেওয়ার আগে আপনি দেখতে পাবে কোন প্রক্রিয়াটি সর্বশেষে এলডি_লিবিআরএএপিএটি আছে।


2

(এই প্রশ্নটি খুব পুরানো, তবে আমি ঠিক একই সমস্যার মুখোমুখি হয়েছি এবং উত্তরোত্তর সমাধানের জন্য ডকুমেন্ট দিচ্ছি :)

আমি জিএনইউ স্ক্রিনে (টার্মিনাল মাল্টিপ্লেক্সার) সমস্যা পেয়েছি তবে এটি নিয়মিত টার্মিনালের সাথেও ঘটতে পারে। টেডি আমার ক্ষেত্রে ঠিক ছিল, স্ক্রিন সেটগুইড সেট করেছে।

$ ls -l /usr/bin/screen
-rwxr-sr-x 1 root 84 361016 Mar 30  2011 /usr/bin/screen
      ^

আমার সমাধানটি ছিল মৃত্যুদন্ড কার্যকর করার আগে LD_LIBRARY_PATH সংরক্ষণ করা এবং এটির পরে পুনরুদ্ধার করা oring সুতরাং আমি নীচের বিষয়বস্তু সহ একটি মোড়ক bin / বিন / স্ক্রিন (PATH এ bin / বিন রাখি) তৈরি করেছি:

#!/bin/bash

# somehow, screen resets LD_LIBRARY_PATH.
# save it here, and restore it in .bashrc
export PRESERVE_LD_LIBRARY_PATH="$LD_LIBRARY_PATH"
/usr/bin/screen "$@"

এবং তারপর এটা দিয়ে এক্সিকিউটেবল তৈরি chmod +x ~/bin/screen। র‍্যাপারটি তুলতে আপনাকে নতুন শেলটি খুলতে হতে পারে।

তারপরে আমি নিম্নলিখিতগুলি ~ / .bashrc এ যুক্ত করেছি। মনে রাখবেন you / .bashrc প্রোফাইলে unlike / .bash_profile এর বিপরীতে প্রতিবার বাশ শুরু করলে তা উত্সাহিত হয়ে যায় যা কেবলমাত্র লগইনে উত্সাহিত হয় (সাধারণত প্রারম্ভকালে, বা আপনি যখন ssh লগইন করেন)।

if [[ "$PRESERVE_LD_LIBRARY_PATH" != "" ]]; then
    export LD_LIBRARY_PATH="$PRESERVE_LD_LIBRARY_PATH"
    #echo "restored LD_LIBRARY_PATH"
    export -n PRESERVE_LD_LIBRARY_PATH
fi

এখন স্ক্রিনটি (বা অটার্ম, এক্সটার্ম, ... এটি উপরে পরিবর্তিত করা উচিত) $ এলডি_লিবিআরএইপিএটিএইচ হিসাবে সংরক্ষণ করা উচিত।


এছাড়াও আপনি পুনরুদ্ধার করতে পারেন LD_LIBRARY_PATHমধ্যে .screenrc(পরিবর্তে .bashrc): setenv LD_LIBRARY_PATH "$PRESERVE_LD_LIBRARY_PATH"দ্বারা অনুসরণunsetenv PRESERVE_LD_LIBRARY_PATH
nandhp

0

দেখে মনে হচ্ছে আপনার নিজের হোম ডিরেক্টরিতে কিছু .bashrc (বা সমমানের) ফাইল রয়েছে যা এই পরিবর্তনশীলটিকে সংজ্ঞায়িত করে। যদিও আমি এর বেশি বিস্তারিত জানি না।

ঠিক আছে সম্পাদনা করুন , বাশ কাজ শুরু করার পরে, আমি .bashrc অনুমান করছি না । আপনি xterm বা aterm শুরু করার সাথে সাথে অন্য কোনও কনফিগারেশন ফাইলও একইভাবে কার্যকর হতে পারে।


এটি আমার আসল চিন্তা ছিল। অনেক খোঁজাখুঁজির পরেও আর কিছু পাওয়া যায় না। আমি খুব পরিষ্কার (নতুন) OME হোম থাকার সুবিধা পেয়েছি।
kjfletch

0

বেশিরভাগ উইন্ডোটিং সিস্টেমগুলি টার্মিনাল উইন্ডোটি চালু করার সময় লগইন প্রক্রিয়াটি পুনরায় তৈরি করে pr

সুতরাং, আপনি যদি এটি একটি নতুন উইন্ডোতে প্রদর্শিত হতে চান তবে এটি আপনার .bash_profile বা .Bashrc এ রাখুন।

আরেকটি বিকল্প হ'ল এক্সটার্ম হ্যান্ড করা (উদাহরণস্বরূপ) একটি স্টার্টআপ স্ক্রিপ্ট চালানোর জন্য একটি যুক্তি। এই স্ক্রিপ্টের শেষে প্রস্থান করবেন না ....


আমার মনে হয় এটিকে অবলম্বন করতে হবে। আমি সম্ভবত .xinitrc উভয় ক্ষেত্রেই আমার পরিবেশের ভেরিয়েবলগুলি উত্স করব যাতে আমার উইন্ডো ম্যানেজারটি তাদের থাকে rc
kjfletch
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.