ম্যানুয়ালি চালিত হওয়ার পরে কেন কোনও এসএসএইচ রিমোট কমান্ড কম পরিবেশের ভেরিয়েবল পাবে? [বন্ধ]


239

আমার কাছে একটি কমান্ড রয়েছে যা আমি যদি কোনও মেশিনে গিয়ে চালিত করি এবং এটি চালিত করি তবে ঠিকঠাক হয়, তবে আমি যখন রিমোট এসএসএস কমান্ড ব্যবহার করে এটি চালানোর চেষ্টা করি তখন ব্যর্থ হয়:

ssh user@IP <command>

উভয় পদ্ধতি ব্যবহার করে "এনভি" এর আউটপুট তুলনা করা বিভিন্ন পরিবেশে পুনরায় সূচিত হয়। আমি যখন ম্যানুয়ালি মেশিনে লগইন করি এবং এনভিটি চালিত করি, তখন আমি চালিত হইলে আরও অনেক বেশি পরিবেশের ভেরিয়েবল পাই:

ssh user@IP "env"

কোন ধারণা কেন?


30
কেন এই প্রশ্নটি বন্ধ বিষয় হিসাবে বন্ধ?
jottr

13
সম্ভবত কারণ এটি প্রোগ্রামিং সম্পর্কিত নয়। এটি বন্ধের পরিবর্তে সুপার ইউজারে স্থানান্তরিত করা উচিত ছিল।
ড্যানিয়েল এইচ

8
bashস্ক্রিপ্টিং ভাষা না?
ড্যান নিসেনবাউম

ডেবিয়ান 8-এ আমাকে কোনও কারণে শেলটি ব্যাশ ইন / ইত্যাদি / পাসডাব্লুতে পরিবর্তন করতে হয়েছিল। এমনকি বাশ / বিন / শ পয়েন্টে পুনরায় কনফিগারিং ড্যাশ সহায়তা দেয় না।
ব্যবহারকারী 1050755

উত্তর:


173

বিভিন্ন ধরণের শাঁস রয়েছে। এসএসএইচ কমান্ড এক্সিকিউশন শেলটি একটি অ-ইন্টারেক্টিভ শেল, যেখানে আপনার সাধারণ শেল হয় লগইন শেল বা একটি ইন্টারেক্টিভ শেল। ম্যান বাশ থেকে বর্ণনা অনুসরণ করা হয়েছে:

       লগইন শেল হ'ল এটিই যার যুক্তির প্রথম চরিত্র
       শূন্য হ'ল একটি - বা একটি - লগিন বিকল্প দিয়ে শুরু হয়েছিল।

       একটি ইন্টারেক্টিভ শেলটি অ-বিকল্প ছাড়াই শুরু হয়
       আর্গুমেন্ট এবং -c বিকল্প ছাড়াই যার স্ট্যান্ডার্ড ইনপুট
       এবং ত্রুটি উভয়ই টার্মিনালের সাথে সংযুক্ত (নির্ধারিত হিসাবে)
       isatty (3)) দ্বারা বা একটি -i বিকল্প দিয়ে শুরু হয়েছিল। পিএস 1 হ'ল
       সেট এবং $ - এর মধ্যে আমি অন্তর্ভুক্ত করি যদি বাশ ইন্টারেক্টিভ হয় তবে এ
       এই অবস্থার পরীক্ষা করতে শেল স্ক্রিপ্ট বা একটি স্টার্টআপ ফাইল।

       নিম্নলিখিত অনুচ্ছেদগুলিতে ব্যাশ এটি কার্যকর করে কীভাবে তা বর্ণনা করে
       প্রারম্ভ ফাইল। যদি ফাইলগুলির কোনও উপস্থিত থাকে তবে তা হতে পারে না
       পড়ুন, ব্যাশ একটি ত্রুটির খবর দেয়। টিল্ডগুলি ফাইলগুলিতে প্রসারিত হয়
       নামগুলি টিলেডে সম্প্রসারণের নীচে বর্ণিত হিসাবে
       অনুচ্ছেদ বিভাগ।

       যখন বাশকে একটি ইন্টারেক্টিভ লগইন শেল বা হিসাবে হিসাবে ডাকা হয়
       --login বিকল্প সহ একটি অ-ইন্টারেক্টিভ শেল, এটি প্রথমে
       / ইত্যাদি / প্রোফাইল ফাইল থেকে কমান্ডগুলি পড়ে এবং কার্যকর করে
       যে ফাইল বিদ্যমান। ফাইলটি পড়ার পরে এটি সন্ধান করে
       in / .বাশ_ প্রোফাইল, ~ / .বাশ_লগিন এবং ~ /। প্রোফাইল, এতে
       অর্ডার দেয় এবং প্রথমটি থেকে আদেশগুলি পড়ে এবং কার্যকর করে
       এটি বিদ্যমান এবং পাঠযোগ্য। --Noprofile বিকল্পটি হতে পারে
       শেলটি এই আচরণটি বাধা দিতে শুরু করা হলে ব্যবহার করা হবে
       ior।

       লগইন শেলটি যখন প্রস্থান করে, বাশ কমান্ডগুলি পড়ে এবং কার্যকর করে
       ফাইলটি ~ / .bash_logout থেকে উপস্থিত থাকলে তা উপস্থিত থাকে।

       একটি ইন্টারেক্টিভ শেল যা লগইন শেল নয় is
       শুরু হয়েছে, বাশ reads / .bashrc থেকে আদেশগুলি পড়ে এবং কার্যকর করে,
       যদি ফাইল উপস্থিত থাকে। এটি ব্যবহার করে বাধা দেওয়া হতে পারে
       --norc বিকল্প। --Rcfile ফাইল বিকল্প বাশকে বাধ্য করবে
       পরিবর্তে ফাইল থেকে কমান্ডগুলি পড়তে এবং সম্পাদন করতে
       ~ / .Bashrc।

       যখন শশ চালানোর জন্য ব্যাশটি অ-ইন্টারেক্টিভভাবে শুরু করা হয়
       স্ক্রিপ্ট, উদাহরণস্বরূপ, এটি BASH_ENV এর মধ্যে চলকটি সন্ধান করে
       পরিবেশ, তার মানটিকে প্রসারিত করে যদি সেখানে উপস্থিত হয়,
       এবং পড়ার জন্য কোনও ফাইলের নাম হিসাবে প্রসারিত মানটি ব্যবহার করে
       এবং কার্যকর। নীচের কমান্ডের মতো বাশ আচরণ করে
       মৃত্যুদন্ড কার্যকর করা হয়েছিল:
              যদি [-n "$ BASH_ENV"]; তারপর। "$ BASH_ENV"; ফাই
       তবে PATH ভেরিয়েবলের মান অনুসন্ধান করতে ব্যবহৃত হয় না
       ফাইল নামের জন্য।


7
দুর্দান্ত উত্তর, এটি হুবহু সমস্যা ছিল, প্রয়োজনীয় পরিবেশের ভেরিয়েবলগুলি / ইত্যাদি / বাশার্কে থাকে, যা ইন্টারেক্টিভ মোডে উত্সাহিত হয় না। এগুলিকে / ইত্যাদি / প্রোফাইলে সরানো সমস্যার সমাধান করে। আপনাকে অনেক ধন্যবাদ!
টম ফেইনার

1
এই উত্তরটি কেবল একটি আংশিক সমাধানে। এখানে আরও কিছু তথ্য দেওয়া হয়েছে: উত্সযুক্ত বিভিন্ন ফাইলগুলিতে একটি ভিন্ন পরিবেশের পরিবর্তনশীল (যেমন রফতানির জন্য SOURCED_SYSTEM_ETC_BASHRC) যুক্ত করুন: / ইত্যাদি / প্রোফাইল, ইত্যাদি / বাশার্ক, ~ /। প্রোফাইল, ~ / .bash_profile, ~ / bashrc। তারপরে জেনকিন্স আউটপুটে সেই অনন্য পরিবর্তনীয়টি সন্ধান করুন। আমার ক্ষেত্রে, আমি 'রফতানি SOURCED_SYSTEM_ETC_BASHRC = হ্যাঁ' ধারণ করে / ইত্যাদি / বাশার্ক আপডেট করেছি এবং সেই পরিবর্তনকটি নোডের জন্য জেনকিন্স লগ-এ প্রদর্শিত হয়েছিল। সুতরাং আমার ক্ষেত্রে, জিনকিনস ক্রীতদাসদের জন্য পরিবেশের ভেরিয়েবলগুলি সেট করতে তাদের / etc / bashrc এ যেতে হবে। জেনকিন্স ssh লগইন শুধুমাত্র উত্সযুক্ত / ইত্যাদি / বাশার্ক।
কোডার রোডি 21

সংশোধন: আমি বোঝাতে /etc/bash.bashrc, / etc / bashrc নয়।
কোডার রোডি 21

37
এটি পাঠ্যের বেশ প্রাচীর, আমি মনে করি এটি হাইলাইট করার ssh user@host "bash --login -c 'command arg1 ...'"উপযুক্ত হবে যা দূরবর্তী শেলটি লগইন পরিবেশ স্থাপন করবে। আপনার উদ্ধৃত অংশটি উল্লেখ করেছে --loginতবে এটি উপেক্ষা করা সহজ হবে।
কোডবার্ড

এই পোস্টের জন্য আপনাকে ধন্যবাদ, আমি ssh <ssh options> <IP> bash --login my_script.shরিমোট মেশিনে একটি স্ক্রিপ্ট JAVA_HOME
চালাতাম

117

কমান্ড চালানোর আগে প্রোফাইলে সোর্সিং সম্পর্কে কীভাবে?

ssh user@host "source /etc/profile; /path/script.sh"

আপনি এটা শ্রেষ্ঠ এটি যে পরিবর্তন হতে পারে ~/.bash_profile, ~/.bashrcঅথবা যা খুশি।

( এখানে যেমন (linuxquestions.org) )


1
এই সমস্যাটি থাকলে এই সমাধানটি দুর্দান্ত কাজ করে।
সাম 152

10
পরিবেশকে উত্স করতে সর্বদা অতিরিক্ত কোড টাইপ করা হাস্যকর!
মাইকেল

4
কেউ খুব কমই বার বার এই ধরণের জিনিস টাইপ করে, সাধারণত এটি কোনও স্ক্রিপ্টের মধ্যে থাকবে এবং যেমনটি যতটা "অতিরিক্ত কোড" রয়েছে ততক্ষণ তা যতক্ষণ কাজ করে না: টিএম:
ইয়ান ভাগান

1
যদি আমি / ইত্যাদি / প্রোফাইল এবং ~ / .bash_profile উভয় উত্স উত্পন্ন করি (পথে ব্যবহারকারী সংযোজন পেতে) এটি কাজ করে তবে এটি কুৎসিত। "ইন্টারেক্টিভ" লগইনটি ব্যবহার করতে এবং দূরবর্তী মেশিনে পুরো ব্যবহারকারী-নির্দিষ্ট পথটি শেষ করতে কমান্ডটি (আমার ক্ষেত্রে এক্সটার্ম) বলার সহজ উপায় থাকতে হবে?
জেস

ssh $ 1 "উত্স ~ / .bashrc; ~ / temp_unix.sh" এখানে temp_unix.sh এর MANI_Home = "মণি গভীর" রফতানি করেছে তবে এটি কার্যকর নয়।
মণি গভীর

90

রিমোট ssh কমান্ড চলাকালীন শেল পরিবেশ লোড হয় না। আপনি ssh পরিবেশ ফাইল সম্পাদনা করতে পারেন:

vi ~/.ssh/environment

এর বিন্যাসটি হ'ল:

VAR1=VALUE1
VAR2=VALUE2

এছাড়াও, বিকল্পের sshdজন্য কনফিগারেশন পরীক্ষা করুন PermitUserEnvironment=yes


1
পরিপূর্ণতা! +100 যদি আমি করতে পারি :)
ডেক্সটার

"বাশ: জিসিসি: কমান্ড পাওয়া যায় নি" ত্রুটি দিয়ে ভিজুয়ালজিডিবি ব্যর্থ হয়েছিল এবং এই সমাধানটি এটি সংশোধন করে।
ক্যালেনজি

কল্পনাপ্রসূত। আমি যদি এই সম্পর্কে বছর আগে জানতাম।
মাধ্যাকর্ষণ

এই নিখুঁত উত্তর!
জিরাপং

1
@ pg2455 আপনি যখন সর্বদা আপনার সার্ভারে sshd কনফিগার করতে সক্ষম নন (বা এটি সকলের জন্য সক্ষম করতে চান না), আপনি এখনও আপনার ব্যবহারকারীর পরিবেশ সম্পাদনা করতে পারেন
dpedro

63

আমারও একই সমস্যা ছিল, তবে শেষ পর্যন্ত আমি জানতে পেরেছিলাম যে I / .Bashrc আমার প্রয়োজন ছিল।

তবে উবুন্টুতে আমাকে লাইনটি মন্তব্য করতে হয়েছিল যা প্রসেসিং s / .brcrc বন্ধ করে দেয়:

#If not running interactively, don't do anything
[ -z "$PS1" ] && return

8
বিকল্পভাবে, আপনি কেবলমাত্র আপনার সমস্ত "অ-ইন্টারেক্টিভ" কোডটি সেই লাইনের উপরে রাখতে পারেন।
মেশিনঘস্ট

সুন্দরী, আমাকে অনেক সময় বাঁচিয়েছে :) ধন্যবাদ
ল্যান্স পোলার্ড

ধন্যবাদ। শুধু যোগ প্রত্যাবর্তন বিবৃতি দিয়ে ফাইল পাওয়া যাবে যে /etc/bash.bashrc
আদর্শ

সার্ভারে এটিকে পরিবর্তন না করেই কি বাইপাস করা যায়?
Yoni

আমার স্ক্রিপ্টটি কেন কাজ করে না তা বোঝার চেষ্টা করে আমি অনেক সময় ব্যয় করেছি। কে বাশার্কে এই রেখাগুলি স্থাপন করা ভাল ধারণা বলে ???
শার্কাক্স

4

আমি স্ক্রিপ্টের শীর্ষে উত্স / ইত্যাদি / প্রোফাইল যুক্ত করা এই ইস্যুটির জন্য একটি সহজ রেজোলিউশন পেয়েছি sh আমি টার্গেট সিস্টেমে চালানোর চেষ্টা করছি was এখানকার সিস্টেমে এটির ফলে পরিবেশগত ভেরিয়েবলগুলি ঘটেছিল যা স্ক্রিপ্ট.শ দ্বারা প্রয়োজনীয় কনফিগার করার জন্য যেমন লগইন শেল থেকে চলছিল।

পূর্বের প্রতিক্রিয়াগুলির মধ্যে একটিতে ~ / .bashr_profile ইত্যাদি ... ব্যবহার করার পরামর্শ দেওয়া হয়েছিল। আমি এতে খুব বেশি সময় ব্যয় করি নি, তবে সমস্যাটি হ'ল যদি আপনি উত্স সিস্টেমে যে শেলটি থেকে লগ ইন করেন তার চেয়ে লক্ষ্য সিস্টেমে আপনি যদি কোনও আলাদা ব্যবহারকারীর সাথে লম্বা হন তবে এটি আমার কাছে উপস্থিত হয়েছে যা উত্স সিস্টেম ব্যবহারকারীকে সৃষ্টি করে ~ এর জন্য ব্যবহার করা নাম ~


পারফেক্ট! সমস্যার চমৎকার এক-লাইন সমাধান।
কর্পোরিকো

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