রিমোট ssh কমান্ডে ভেরিয়েবলগুলি পাস করা


103

আমি আমার মেশিন থেকে ssh ব্যবহার করে একটি কমান্ড চালাতে সক্ষম হতে পারি এবং পরিবেশের ভেরিয়েবলটি দিয়ে যেতে পারি $BUILD_NUMBER

আমি যা চেষ্টা করছি তা এখানে:

ssh pvt@192.168.1.133 '~/tools/myScript.pl $BUILD_NUMBER'

$BUILD_NUMBER ssh কল করার জন্য মেশিনে সেট করা আছে এবং যেহেতু দূরবর্তী হোস্টে ভেরিয়েবলের অস্তিত্ব নেই তাই এটি বাছাই হয় না।

আমি কীভাবে এর মান পাস করব $BUILD_NUMBER?


4
হডসনের সাথে সম্পর্কিত নয়, ট্যাগটি সরিয়েছেন। (হাডসন কেবল পরিবর্তনশীল তৈরি করে)
পিটার শোয়েট

উত্তর:


198

আপনি যদি ব্যবহার

ssh pvt@192.168.1.133 "~/tools/run_pvt.pl $BUILD_NUMBER"

পরিবর্তে

ssh pvt@192.168.1.133 '~/tools/run_pvt.pl $BUILD_NUMBER'

আপনার শেলটি $BUILD_NUMBERদূরবর্তী হোস্টে কমান্ড স্ট্রিং প্রেরণের আগে বিভাজন করবে ।


8
যদি কেউ একক উদ্ধৃতি ব্যবহার করে থাকে যাতে উদ্ধৃতিগুলিতে অন্তর্ভুক্ত কমান্ডটি স্থানীয়ভাবে মূল্যায়ন না করা হয়, তবে তাদের "" AR পরিবর্তনশীল '"ব্যবহার করা উচিত। উদাহরণ: ssh pvt@192.168.1.133 '~ / সরঞ্জাম / রান_pvt.pl "' $ বিল্ড_বিআর '" "
dr.doom

4
জানেন না যে বাশ একক উদ্ধৃতি এবং ডাবল উদ্ধৃতি দিয়ে আলাদাভাবে প্রতিক্রিয়া জানায়। ধন্যবাদ!
সিলগন

4
লিনাক্স কোর বিকাশকারীদের অবশ্যই জাহান্নামে পোড়াতে হবে
সোনার স্টার

@ গোল্ডস্টার, নোট করুন যে শেলের মধ্যে একক উদ্ধৃতি এবং ডাবল উদ্ধৃতি আচরণের মধ্যে পার্থক্য কয়েক দশক ধরে লিনাক্সকে পূর্বাভাস দেয়।
30:53

4
পিএসএ: যদি আপনার স্ট্রিংটিতে ব্যবহারকারীর ইনপুট থাকে তবে এটি খুব খারাপ ধারণা এবং কোড ইনজেকশন আক্রমণে আপনাকে উন্মুক্ত করতে পারে।
ব্রায়ান ম্যাকচাটন

27

একক উদ্ধৃতিতে চলকগুলি মূল্যায়ন করা হয় না। ডাবল উদ্ধৃতি ব্যবহার করুন:

ssh pvt@192.168.1.133 "~/tools/run_pvt.pl $BUILD_NUMBER"

শেলটি ডাবল-কোটে ভেরিয়েবলগুলি প্রসারিত করবে, তবে একক-উদ্ধৃতিতে নয়। sshকমান্ডে যাওয়ার আগে এটি আপনার পছন্দসই স্ট্রিংয়ে পরিবর্তিত হবে ।


3

(এই উত্তরটি অযথা জটিল বলে মনে হতে পারে তবে আমি যতদূর জানি হোয়াইটস্পেস এবং বিশেষ চরিত্রগুলি সম্পর্কে এটি সহজেই বর্ধিত এবং দৃust়।

আপনি ঠিক sshকমান্ডের স্ট্যান্ডার্ড ইনপুট এবং readদূরবর্তী অবস্থান থেকে ডেটা ফিড করতে পারেন ।

নিম্নলিখিত উদাহরণে,

  1. একটি সূচিযুক্ত অ্যারে ভেরিয়েবলের নামগুলি সহ সুবিধার জন্য (সুবিধার জন্য) পূরণ করা হয় যার মানগুলি আপনি দূরবর্তী দিকে পুনরুদ্ধার করতে চান।
  2. এই প্রতিটি ভেরিয়েবলের জন্য, আমরা ভেরিয়েবলের sshনাম এবং মান প্রদান করে একটি নাল-টার্মিনেটেড লাইন দিয়ে থাকি ।
  3. ইন shhকমান্ড নিজেই, আমরা এই লাইনের মাধ্যমে লুপ প্রয়োজনীয় ভেরিয়েবল ইনিশিয়ালাইজ।
# Initialize examples of variables.
# The first one even contains whitespace and a newline.
readonly FOO=$'apjlljs ailsi \n ajlls\t éjij'
readonly BAR=ygnàgyààynygbjrbjrb

# Make a list of what you want to pass through SSH.
# (The “unset” is just in case someone exported
# an associative array with this name.)
unset -v VAR_NAMES
readonly VAR_NAMES=(
    FOO
    BAR
)

for name in "${VAR_NAMES[@]}"
do
    printf '%s %s\0' "$name" "${!name}"
done | ssh user@somehost.com '
    while read -rd '"''"' name value
    do
        export "$name"="$value"
    done

    # Check
    printf "FOO = [%q]; BAR = [%q]\n" "$FOO" "$BAR"
'

আউটপুট:

FOO = [$'apjlljs ailsi \n ajlls\t éjij']; BAR = [ygnàgyààynygbjrbjrb]

আপনার যদি exportতাদের প্রয়োজন না হয় তবে আপনার declareপরিবর্তে এটি ব্যবহার করতে সক্ষম হওয়া উচিত export

একটি সত্যিকারের সরলীকৃত সংস্করণ (যদি আপনার এক্সটেনসিবিলিটির প্রয়োজন না হয়, প্রক্রিয়া করার জন্য একটি একক ভেরিয়েবল থাকে ইত্যাদি) দেখতে দেখতে এই রকম হবে:

$ ssh user@somehost.com 'read foo' <<< "$foo"

2

ডিফল্টরূপে এসএসএইচডিতে গৃহীত পরিবেশের পরিবর্তনশীলগুলির তালিকার অন্তর্ভুক্ত LC_*। এইভাবে:

LC_MY_BUILDN="1.2.3" ssh -o "SendEnv LC_MY_BUILDN" ssh-host 'echo $LC_MY_BUILDN'
1.2.3

1

Ssh এর মাধ্যমে পরিষ্কারভাবে পরিবেশের ভেরিয়েবলগুলি পাস করাও সম্ভব। এটির মাধ্যমে কিছু সার্ভার-সাইড সেট আপ করা দরকার, সুতরাং এটি সর্বজনীন উত্তর নয়।

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

সার্ভারে, sshd_configফাইলটি সম্পাদনা করুন /etc/ssh/sshd_configএবং সাধারণত AcceptEnvযে ভেরিয়েবলগুলি আপনি পাস করতে চান তার সাথে মিল রেখে একটি নির্দেশিকা যুক্ত করুন । দেখুন man sshd_config। আমার ক্ষেত্রে, আমি বার্গ ব্যাকআপে ভেরিয়েবলগুলি পাস করতে চাই তাই আমি বেছে নিলাম:

AcceptEnv BORG_*

এখন ক্লায়েন্টে -o SendEnvএনভায়রনমেন্ট ভেরিয়েবল প্রেরণ করতে অপশনটি ব্যবহার করুন । নিম্নলিখিত কমান্ড লাইনটি পরিবেশের পরিবর্তনশীল সেট করে BORG_SECRETএবং তারপরে এটি ক্লায়েন্ট মেশিনে প্রেরণ করতে ডাকবে (ডাকা backup)। এটি তখন printenvসেখানে চলে এবং BORG ভেরিয়েবলের জন্য আউটপুট ফিল্টার করে:

$ BORG_SECRET=magic-happens ssh -o SendEnv=BORG_SECRET backup printenv | egrep BORG
BORG_SECRET=magic-happens

আপনি ডিফল্ট সার্ভার সাইড সেটিংস ব্যবহার করে আপনার ভেরিয়েবলগুলি "চোরাচালান" করতে পারেন, আমার উত্তর দেখুন । গিস্টটি হ'ল, ডিফল্ট ওপেনএসএসএইচডি কনফিগারেশনে LC_*ভেরিয়েবলগুলি প্রেরণের অনুমতি হিসাবে অন্তর্ভুক্ত রয়েছে , তাই কেবল ব্যবহার করুন $LC_TvE_foo, বা $LC_BORG_SECRETকেবল নিশ্চিত করুন যে আপনি কোনও বিল্ট-ইন ভেরিয়েবলের সাথে "সংঘর্ষ" না করছেন।
অ্যালেক্স স্ট্রিজি

0

পূর্বে উত্তর হিসাবে, আপনার দূরবর্তী হোস্টে পরিবেশের পরিবর্তনশীল সেট করার দরকার নেই। পরিবর্তে, আপনি কেবল স্থানীয় হোস্টের মেটা-প্রসারণ করতে পারেন এবং দূরবর্তী হোস্টের কাছে মানটি দিতে পারেন।

ssh pvt@192.168.1.133 '~/tools/run_pvt.pl $BUILD_NUMBER'

আপনি যদি সত্যিই রিমোট হোস্টে পরিবেশের পরিবর্তনশীল সেট করতে চান এবং এটি ব্যবহার করতে চান তবে আপনি envপ্রোগ্রামটি ব্যবহার করতে পারেন

ssh pvt@192.168.1.133 "env BUILD_NUMBER=$BUILD_NUMBER ~/tools/run_pvt.pl \$BUILD_NUMBER"

এই ক্ষেত্রে এটি একটি ওভারকিল কিছুটা, এবং দ্রষ্টব্য

  • env BUILD_NUMBER=$BUILD_NUMBER স্থানীয় হোস্টে মেটা সম্প্রসারণ করে
  • দূরবর্তী BUILD_NUMBERপরিবেশের পরিবর্তনশীল
    দূরবর্তী শেল দ্বারা ব্যবহৃত হবে

-2

Ssh সেশনের বাইরে ভেরিয়েবলগুলি অ্যাক্সেসের জন্য ভেরিয়েবলটি ছেড়ে যান: ssh pvt@192.168.1.133 "~ / সরঞ্জাম / MyScript.pl $ U বিল্ড_বিআর"


4
এটি প্রশ্নটি যা জিজ্ঞাসা করছে তা অর্জন করে না।
প্যাট্রিক ট্রেনটিন

4
শেল দৃষ্টিকোণ থেকে '$FOO'সমান "\$FOO"। প্রশ্নটি ছিল "এসএসএইচ দিয়ে শেল পরিবর্তনশীল কীভাবে পাস করবেন?"। যেমনটি ইতিমধ্যে @ পেট্রিক্টর্টিন লিখেছেন এটি সঠিক উত্তর নয় কারণ তখন BUILD_NUMBERপরিবেশের পরিবর্তনশীল দূরবর্তীভাবে সেট করা হয় না।
গিলস গৌইলার্ডেট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.