যখন ssh'ing, আমি কীভাবে একটি সার্ভারে পরিবেশের পরিবর্তনশীল সেট করতে পারি যা সেশন থেকে সেশনে পরিবর্তিত হয়?


92

যখন আমি sshকোনও সার্ভারে প্রবেশ করি তখন ক্লায়েন্ট থেকে সার্ভারে পরিবেশের পরিবর্তনশীল কীভাবে পাস করতে পারি? এই পরিবেশের পরিবর্তনের পরিবর্তে এসএসএসের বিভিন্ন অনুরোধের মধ্যে পরিবর্তন হয় তাই আমি $HOME/.ssh2/environmentপ্রতিবার এসএসএস কল করার পরে আমি ওভাররাইট করতে চাই না । কিভাবে আমি এটি করতে পারব?


2
আপনার প্রশ্নটি একটি লিয়িটল আরও নির্দিষ্ট হওয়া দরকার।
ইগনেসিও ওয়াজকেজ-আব্রামস

3
প্রশ্নটি আমার কাছে যথেষ্ট স্পষ্ট ছিল। যাইহোক, sshম্যান পৃষ্ঠা থেকে, আপনি একবার সার্ভারে লগ ইন করার পরে ম্যানুয়ালি ভেরিয়েবল সেট করা ছাড়া অন্য কোনও উপায় দেখতে পাচ্ছি না, যদি না আপনি ~ / .ssh2 / পরিবেশ পরিবর্তন করেন ify
গ্যারিজোহন

এটি কি প্রতিবারই আলাদা পরিবর্তনশীল? নাকি আলাদা মান?
ডেনিস উইলিয়ামসন


1
অন্যভাবে রাউন্ড, কারণ এটি ইতিমধ্যে আরও জনপ্রিয়। এটি বড় হওয়ার কিছু নেই।
কেনোরব

উত্তর:


110

অবশ্যই, আপনি কমান্ডের মধ্যে পরিবেশের পরিবর্তনশীল সেট করতে পারেন, তবে আপনাকে উদ্ধৃতি দেওয়ার বিষয়ে সতর্কতা অবলম্বন করতে হবে: মনে রাখবেন যে আপনার শেলটি আপনার স্থানীয় কমান্ড লাইনটি পার্স করতে চলেছে, এবং তারপরে রিমোট শেলটি স্ট্রিংটিতে যাবে go গ্রহণ করে।

আপনি যদি ক্লায়েন্টটিতে থাকা সার্ভারে একই ভেরিয়েবল পেতে চান তবে এই SendEnvবিকল্পটি ব্যবহার করে দেখুন:

ssh -o SendEnv = MYVAR server.example.com মাইকম্যান্ড

যদিও এটির জন্য সার্ভারের সহায়তা প্রয়োজন। ওপেনএসএসএইচ সহ, চলক নামটি অনুমোদিত করতে হবে /etc/sshd_config

যদি সার্ভার কেবলমাত্র নির্দিষ্ট নির্দিষ্ট পরিবর্তনশীল নামের অনুমতি দেয় তবে আপনি তার চারপাশে কাজ করতে পারেন; উদাহরণস্বরূপ একটি সাধারণ সেটআপ এর LC_*মাধ্যমে অনুমতি দেয় এবং আপনি নিম্নলিখিতগুলি করতে পারেন:

ssh -o SendEnv = LC_MYVAR server.example.com 'MYVAR = $ LC_MYVAR; LC_MYVAR আনসেট করুন; MYVAR রফতানি করুন; mycommand '

এমনকি LC_*যদি কোনও বিকল্প না হয়, আপনি TERMপরিবেশগত পরিবর্তনশীলতে তথ্যটি পাস করতে পারেন যা সর্বদা অনুলিপি করা হয় (তবে এর দৈর্ঘ্যের সীমাও থাকতে পারে)। আপনাকে এখনও নিশ্চিত করতে হবে যে দূরবর্তী শেলটি TERMএকটি পরিচিত টার্মিনাল প্রকার নির্ধারণের জন্য ভেরিয়েবলকে সীমাবদ্ধ করে না । -tআপনি যদি রিমোট ইন্টারেক্টিভ শেলটি শুরু না করেন তবে স্যাশ করার বিকল্পটি পাস করুন ।

env TERM = "অতিরিক্ত তথ্য: $ TERM" ssh -t server.example.com 'MYVAR = $ ER শর্ত%: *}; শব্দটি = $ {শব্দটি ## *:}; MYVAR রফতানি করুন; mycommand '

আর একটি সম্ভাবনা হ'ল ভেরিয়েবলটি সরাসরি কমান্ডের মাধ্যমে সংজ্ঞায়িত করা:

ssh -t server.example.com 'MYVAR = "অতিরিক্ত তথ্য" রফতানি করুন; mycommand '

সুতরাং, যদি স্থানীয় ভেরিয়েবলটি পাস করা হয়:

ssh -t server.example.com 'এক্সপোর্ট MYVAR =' "'$ লোকালভার'" '; mycommand '

তবে, উদ্ধৃত ইস্যুগুলি থেকে সাবধান থাকুন: ভেরিয়েবলের মান প্রত্যন্ত পার্শ্বে কার্যকর শেল স্নিপেটে সরাসরি বিভক্ত হবে। উপরের শেষ উদাহরণটি ধরে নেওয়া হয়েছে যে $LOCALVARকোনও একক উদ্ধৃতি ( ') নেই।


2
অনেক ধন্যবাদ, আমি একটি ক্রোধে ছিলাম যে বোকা এলসি_ * ভেরিয়েবলগুলি এসএসএসে রফতানি করা হয় এবং আপনার উত্তর আমাকে কোথায় সন্ধান করবে তা নির্দেশিত করে। আমাকে কেবল এটি অক্ষম করতে হবে ~ / .ssh / config
akostadinov

1
আমি মূল পোস্টারের পরিস্থিতিতে আছি, তবে যে পরিবর্তনশীলটি আমি এগিয়ে চেয়েছিলাম তা হ'ল TERM, সুতরাং আমি আপনার উত্তরে কিছুটা বিস্মিত। TERM- এর এই স্বয়ংক্রিয় ফরওয়ার্ডিং কি সাম্প্রতিক ওপেনএসএসএইচ সংস্করণগুলি দ্বারা অক্ষম করা হয়েছে?
ডাব

1
@ ডউব অ্যাডমিনিস্ট্রেটররা পছন্দসই AcceptEnvনির্দেশাবলী সহ সার্ভার সাইডে সমস্ত পরিবেশের পরিবর্তনশীলগুলি অস্বীকার করা ডিফল্ট sshd_config। তবে TERMবিশেষভাবে চিকিত্সা করা হয়, যতদূর আমি জানি সার্ভার সাইডে এটি ফিল্টার করার কোনও উপায় নেই (এটি কোনও শংসার বিন্যাস নির্বিশেষে শেলের পরিবেশে সেট করা আছে)। আপনি কি নিশ্চিত যে কোনও প্রোফাইল স্ক্রিপ্ট ওভাররাইড করে না (যেমন /etc/profileবা ~/.profileবা ~/.bashrc)?
গিলস

2
@ গিলস: আমি এটি আবার পরীক্ষা করে দেখেছি এবং যদি না আমি স্পষ্টভাবে আমার অ্যাকসেপ্টইনভের নির্দেশিকায় TERM যুক্ত না করি তবে TERM পাস করা হয় না। আমি শেলটি খুলছি না, তবে সরাসরি একটি কমান্ড চালাচ্ছি, উদাহরণস্বরূপ: "ssh -o SendEnv = TERM শেল.এক্সামেল.কম env"। এটি সমস্ত পরিবেশের পরিবর্তনশীল মুদ্রণ করে এবং TERM কেবলমাত্র ক্লায়েন্টের SendEnv এবং সার্ভারে AcceptEnv এ থাকলে উপস্থিত হয়। যদি আমি "ssh -o SendEnv = TERM শেল.এক্স্পেল.কম.একো run $ {TERM}" স্বীকার করে নিন AcceptEnv বা সেন্ডইএনভি সহ, এটি "বোবা" মুদ্রণ করে, যা আমি নিশ্চিত যে এটি কোথা থেকে এসেছে (এনভ এমনকি হয় না সেক্ষেত্রে TERM তালিকাভুক্ত করুন)।
ডাব

7
@ দউব ওহ, আমি দেখছি TERMক্লায়েন্ট যদি সার্ভারকে একটি টিটিটি বরাদ্দের জন্য অনুরোধ করে তবেই তা প্রেরণ করা হয়। যদি দূরবর্তী দিকের কোনও টার্মিনাল না থাকে তবে তা প্রেরণে অকেজো হবে TERM। আপনি যখন কোনও কমান্ড নির্দিষ্ট করেন, আপনি যদি দূরবর্তী দিকের টার্মিনাল রাখতে চান তবে আপনার -tকমান্ড লাইন বিকল্পটি (বা RequestTTYইন ~/.ssh/config) লাগবে ।
গিলস

12

আপনি যদি লক্ষ্য হোস্টটি পরিচালনা করতে পারেন তবে আপনি লক্ষ্য হোস্টের সাথে আপনার স্থানীয় পরিবেশের ভেরিয়েবলগুলি পাস করার জন্য sshd কনফিগার করতে পারেন।

Sshd_config ম্যান পৃষ্ঠা থেকে:

 PermitUserEnvironment
     Specifies whether ~/.ssh/environment and environment= options in
     ~/.ssh/authorized_keys are processed by sshd.  The default is
     "no".  Enabling environment processing may enable users to bypass
     access restrictions in some configurations using mechanisms such
     as LD_PRELOAD.

sshd কনফিগারেশন সাধারণত এ থাকে /etc/ssh/sshd_config


7
এটি ডিফল্টরূপে "না" এ সেট করা আছে তা জানা খুব দরকারী!
jathanism

6

সুতরাং, আপনার ক্লায়েন্টে আপনার কিছু পরিবেশের পরিবর্তনশীল রয়েছে এবং আপনি কি এটি রিমোট কমান্ডের জন্য উপলব্ধ হতে চান? আমি মনে করি না যে এসএসএসকে যাদুকরীভাবে এটি পাস করার কোনও উপায় আছে তবে আপনি সম্ভবত এটির মতো কিছু করতে পারেন। ব্যবহারের পরিবর্তে, বলুন:

ssh remote.host my_command

তুমি এটি করতে পারো:

ssh remote.host env ENV_VAR=$ENV_VAR my_command

"সম্ভবত"? আমি এই উত্তরটি চেষ্টা করার আগে আমি এটি পড়তে চাই। আমার পক্ষে কাজ করেনি।
তিশমা

1
প্রাপ্ত কোন ত্রুটি ইত্যাদির বিশদ বিবরণে যত্নশীল?
পাইওটো

1
@ পাইওটো মাইটের উদ্ধৃতি দিতে পারে, যেমন ENV_VAR এর মধ্যে ফাঁকা স্থান রয়েছে
মার্টিন সি মার্টিন

ম্যাকে আপনার একটি ইন্টারেক্টিভ সংস্করণের জন্য -t বিকল্প থাকতে হবে, অন্যথায় এটি আটকে আছে বলে মনে হচ্ছে। সুতরাং এটি কাজ করতে পারে: sh ssh -t রিমোটহোস্ট হ'স্ট এনভী_ভারা = $ ENV_VAR আমার_কমন্ড
মুইনালান

3

@ ফাঁকা সেট এর প্রতিক্রিয়া (যা আমার পক্ষে কার্যকর হয়নি) আমাকে এই উত্তরে নিয়ে গেছে:

আপনি আপনার ~/.ssh/authorized_keysফাইলটিতে এই আদেশটি যুক্ত করতে পারেন :

command="/usr/bin/env VARIABLE=<something> $SHELL" ssh-rsa <key>

export VARIABLE=<something>তাত্ক্ষণিকভাবে প্রস্থান করা হচ্ছে, এবং এসএসএইচ সংযোগটি বন্ধ ছিল (আমাকে সার্ভার থেকে লক করা), অন্যদিকে /usr/bin/env ... $SHELLপরিবর্তিত পরিবেশের সাথে আপনার ডিফল্ট শেলটি চালানো হবে।


আমার জন্য লগ ইন করার সময় এটি কেবল স্তব্ধ হয়ে যায়। আমি এটিকে সরিয়ে দিলে এসএসএইচ স্বাভাবিক অবস্থায় ফিরে আসে এবং আমি আমার স্বাভাবিক লগইন শেলটি পাই।
নিক মিষ্টি 3

@ নিকসুইটিং আপনি কি $SHELLবাস্তবে কোন শেল দিয়ে প্রতিস্থাপনের চেষ্টা করেছেন? সার্ভারে / usr / bin / env বিদ্যমান তাও পরীক্ষা করুন। তবে সমাধানটি নিখুঁত নয়: আমি লক্ষ্য করেছি যে যখন আমি scpকোনও ইনলাইন কমান্ড ব্যবহার করতে চাইছিলাম তখন এটি স্তব্ধ হয়ে যায় ।
ম্যাডপ্রোগ

হ্যাঁ, এটিই আমি প্রথম চেষ্টা করেছি। দুর্ভাগ্যক্রমে কখনই এটি কাজ PermitUserEnvironment yesকরে environment="..."না, এর পরিবর্তে সক্ষম এবং ব্যবহার করে শেষ হয় command="..."
নিক মিষ্টি

এটি আমার পক্ষে সুন্দরভাবে কাজ করছে।
মিঃ তাও

2

আপনার স্থানীয় ক্লায়েন্টে, ~/.ssh/configআপনি এতে যুক্ত করতে পারেন SetEnv, যেমন

Host myhost
  SetEnv FOO=bar

দ্রষ্টব্য: চেক করুন man ssh_config

তারপরে সার্ভারে, ক্লায়েন্টকে আপনার /etc/ssh/sshd_configকনফিগার ফাইলে নির্দিষ্ট পরিবেশের ভেরিয়েবলগুলি পাস করার অনুমতি দেওয়ার বিষয়টি নিশ্চিত করুন:

AcceptEnv LANG LC_* FOO BAR*

দ্রষ্টব্য: চেক করুন man sshd_config


1

আপনার কাছে পাসওয়ার্ড-কম এসএসএস লগইন সেটআপ রয়েছে তা ধরে নিয়ে আপনি একটি কাস্টম কমান্ড চাওয়ার চেষ্টা করতে পারেন। সার্ভারে, আপনার ক্লায়েন্টের চাবিটির সাথে সম্পর্কিত আপনার ~ / .ssh / अधिकृत_keys এন্ট্রিটি সম্পাদনা করুন:

command="export VARIABLE=<something>" ssh-rsa <key>

তাকান এই লিঙ্কে বিভাগে কমান্ড জোর একটু বেশি বিস্তারিত জন্য।


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

1

আমি হোম ডিরেক্টরিতে এবং / ইত্যাদি (ক্র্যাম এফএস কেবল পঠনযোগ্য) কোনও ডিভাইসের জন্য ওপেনএসএসএইচ-র একটি কাস্টম বিল্ড তৈরি করছিলাম যাতে F / .ssh / পরিবেশ পুরো এফএস পুনর্নির্মাণ না করে কাজ করবে না এবং এগুলি ক্ষেত্র স্থাপন করা ছিল ডিভাইস (এম্বেডড সিস্টেমস তাই CRAMFS এর ব্যবহার)। আপনি ashroized_keys ফাইলের অবস্থান sshd_config এ উল্লেখ করতে পারেন তবে কিছু কারণে পরিবেশ = শুধুমাত্র vari / .ssh / authroized_keys এ পরিবেশের পরিবর্তনশীলগুলির জন্য কাজ করে। / ইত্যাদি / প্রোফাইল সম্পাদনা করা কোনও বিকল্প ছিল না এবং আমাকে একটি অ-মানক ডিরেক্টরিতে ssh লোড করতে হয়েছিল। বাচ্চা_সেট_এনভির পরে সেশন.ক্রমে (... "মেল" ...) কেবল আপনার প্রয়োজনীয় পরিবেশগত পরিবর্তনগুলি যুক্ত করুন (এটি আমার জানা একটি হ্যাক ...) তবে যদি আপনি থাকেন তবে সেশনের জন্য কারও কাছে কিছু হার্ডকোডযুক্ত এনভিএস প্রয়োজন উত্স থেকে সংকলন আপনি এটি করতে পারেন। TGI-FLOSS


0

একটি সহজ কমান্ড:

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