কেন একটি ssh রিমোট কমান্ডের $ PATH একটি ইন্টারেক্টিভ শেলের চেয়ে পৃথক হয়?


20

আমার এমন একজন ব্যবহারকারী আছেন যে কোনও ডট-ফাইলে $ PATH এ কোনও পরিবর্তন করেন নি: এটি হ'ল সিস্টেম ডিফল্ট সেটিংস। একটি লগইন শেল থেকে:

$ ssh example.com
user@example.com:~$ cat /tmp/hello.hs
#!/bin/bash

echo "$SHELL"
echo "$PATH"

user@example.com:~$ /tmp/hello.hs
/bin/bash
/usr/local/bin:/usr/bin:/bin

ঠিক যেমন নির্দিষ্ট করা হয়েছে /etc/profile। এটি আমি বরং অপ্রত্যাশিত মনে করি:

$ ssh example.com '/tmp/hello.sh'
/bin/bash       
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games

যেমনটি আমি বলেছিলাম, $ PATH ইন ~/.bashrc, না কোনও পরিবর্তন নেই /etc/bash.bashrc। না ~/.ssh/environmentহয়। ssh(1)ঘোষণা করে যে এনভায়রনমেন্ট ভেরিয়েবল PATHহল

ডিফল্ট PATH তে সেট করুন, ssh সংকলনের সময় নির্দিষ্ট হিসাবে specified

তবে স্ট্যাকওভারফ্লো থেকে এই থ্রেড এবং এই মেইলিং তালিকার নিবন্ধটি সুপারিশ করে যে আমি কোনও শেল স্টার্টআপ ফাইল ইত্যাদির মধ্যে দিয়ে / / / প্রোফাইল পরিবর্তন করে কোনও প্রদত্ত কমান্ডের জন্য $ PATH প্রভাবিত করতে সক্ষম হওয়া উচিত should

এখানে কি হচ্ছে?

উত্তর:


16

ssh(1)ম্যানুয়াল পৃষ্ঠা থেকে : "যদি কমান্ড নির্দিষ্ট করা থাকে তবে এটি লগইন শেলের পরিবর্তে দূরবর্তী হোস্টে কার্যকর করা হয়।"

সুতরাং সংক্ষেপে আপনি যখন মেশিন ব্যাশে লগইন করবেন তখন একটি লগইন শেল হিসাবে শুরু হয় এবং উপযুক্ত ফাইলগুলি লোড হয়, যখন আপনি দূর থেকে সংযোগ স্থাপন করেন এবং একটি কমান্ড জারি করেন তখন এটি ব্যাশের জায়গায় চালিত হয়, যার অর্থ এই ফাইলগুলি লোড হয় না। আপনি এটি ব্যবহার করে এর সাথে su -l -cssh এর কমান্ড অংশে ব্যবহার করতে পারেন around

কিছু ক্ষেত্রে আমি -tssh কাজের পক্ষে যুক্তিও দেখেছি (tty বরাদ্দও)।

সম্পাদনা 1 :
আমি মনে করি আপনি যে প্যাথ তথ্যটি পেয়েছেন তা হ'ল ডিফল্ট পাথ (আমরা এটি ওভাররাইড না করেই) sshd তে সংকলিত। আমি নিশ্চিত করেছি যে আমার / ইত্যাদি / প্রোফাইল, / ইত্যাদি / বাশ *, স্থানীয় ডটফাইলস ইত্যাদির মধ্যে কোনও PATH তথ্য নেই, তারপরে আমি লগইন করেছি এবং এখনও একটি প্যাট ছিল। আমি এসএসডি-তে এটি অনুসন্ধান করেছি এবং এটি সেখানে পেয়েছি। সুতরাং এটির ম্যানপেজটি কীভাবে বলে:

ahnberg@remote$ strings /usr/sbin/sshd | grep -i x11 | grep bin
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games

তারপরে আমি রিমোটে PATH=$PATH:/my/testআমার .bashrcফাইলের একেবারে শীর্ষে যুক্ত করে আবার পরীক্ষা করে দেখি:

ahnberg@local$ ssh ahnberg@remote "env | grep PATH"
PATH=/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/my/test

সুতরাং আমি একেবারে এটি প্রভাবিত করতে পারি, এবং ডিফল্ট PATH হ'ল sshd তে সংকলিত। :)


হুম, "দূরবর্তী হোস্টের উপর মৃত্যুদন্ড কার্যকর করা" এই বাক্যাংশটির অর্থ এর চেয়ে অনেক বেশি, আমি মনে করি। আরও আকর্ষণীয় বিট, যা আমি আগে মিস করেছি, একই ম্যান্যাপের "পরিবেশ" বিভাগে আসে: "পাঠ্য ডিফল্ট PATH তে সেট করুন, এসএসএস সংকলনের সময় নির্দিষ্ট করা হয়েছে।" এটি ব্যতীত এটাই পরামর্শ দেয় যে আমার একটি আদেশের PATH প্রভাবিত করতে সক্ষম হওয়া উচিত
ট্রাউটওয়াইন

ওয়েল পয়েন্টটি হ'ল এটি লগইন শেল নয় তাই এটি চালিত হয় না / উত্স / স্টার্টআপ ফাইলগুলিকে লগইন শেলের মতো একইভাবে অন্তর্ভুক্ত করে, তাই আমার পরামর্শগুলি চেষ্টা করে দেখার জন্য। জিনিসগুলি রাখা .bashrcখুব কার্যকর হতে পারে, তবে সামগ্রিকভাবে আমি যদি पथ গুরুত্বপূর্ণ তবে এটিকে ঘিরে কাজ করব। অথবা আপনার যদি ssh চালানোর 'কমান্ড' উপায়ের প্রয়োজন হয় তবে কেবলমাত্র পুরো পথের নামগুলি নির্দিষ্ট করবেন না কেন? :)
ম্যাটিয়াস অহনবার্গ

আমি আমার পোস্টটি কিছুটা সম্পাদনা করেছি। এখন, একটি লগইন শেল, একটি লগ-ইন শেল এবং এর ইন্টারেক্টিভ / অ-ইন্টারেক্টিভ বৈকল্পিক রয়েছে। এসএসএইচ কমান্ডগুলি অ-ইন্টারেক্টিভ অ-লগইন ফর্মটিতে ব্যবহারকারীর শেলের সাথে যুক্ত। bash(1)ইনভোকেশনটি পরামর্শ দেয় যে এই ফ্যাশনে কোনও প্রারম্ভকালে ফাইলগুলি পড়া হয় না, তবে এসএসএস কীভাবে শেলটি চালাচ্ছে সে সম্পর্কে ডকুমেন্টেশন খুঁজে পাচ্ছি না । এটি উপরের লিঙ্কযুক্ত উত্সগুলির সাথে বিরোধী বলে মনে হচ্ছে, যদি না অন্যদের কাছে আমার কাছে নেই তবে / etc / ssh / sshrc স্টার্টআপ ফাইল। (অবশ্যই
কার্যকার্য রয়েছে

যদি আমি /etc/profileআমার জন্য আমার দূরবর্তী বাক্সের পাথ আপডেটগুলিতে PATH পরিবর্তন করি তবে ssh user@remotebox 'env'আমাকে আপডেট হওয়া পাঠ্য দেখায়। একই জিনিস যদি আমি যোগ যায় export PATH=$PATH:/my/testpath(কিন্তু ইন্টারেক্টিভ শেল জন্য চেক সামনে (ফাইল শীর্ষে আমার ক্ষেত্রে .bashrc করতে -z "$PS1")।
Mattias Ahnberg

আমার পরীক্ষা / ফলাফলের সাথে আপডেট হয়েছে।
ম্যাটিয়াস অহনবার্গ

3

দৌড় দিয়ে দূরবর্তী পথটি ব্যবহার করে আমি কমান্ডগুলি চালনা করতে সক্ষম হয়েছি:

ssh dist@d6 "bash --login -c 'env'"

আপনি যে কমান্ডটি চান তা এখানে env প্রতিস্থাপন করা যেতে পারে।

আমার কাছে অনুমোদিত কী রয়েছে তাই কমান্ড বা ssh চালানোর জন্য কোনও পাসওয়ার্ডের দরকার পড়েনি।


3

সমস্যার সমাধানের জন্য আমি একটি ভিন্ন সমাধান নিয়ে এসেছি। আমার ব্যক্তিগত পছন্দটি হ'ল বিদ্যমান ফাইলগুলি পরিবর্তনের পরিবর্তে নতুন কনফিগারেশন ফাইল তৈরি করা। এইভাবে আমি ডিফল্ট কনফিগারেশন থেকে পরিবর্তনগুলি সহজেই পরাজিত করতে পারি।

এখানে লিখিত বিষয়বস্তু রয়েছে /etc/profile.d/ssh_login.sh:

#!/bin/sh
if [ "$SSH_CONNECTION" ]; then
    echo "User '$USER' logged in from '${SSH_CONNECTION%% *}'"
    . /etc/environment
fi

(এটি ওপেনশ্যাশের সাথেও কাজ করা উচিত) dropbearএর জায়গায় ব্যবহার করে openssh-server, এসএসএইচ_সিওএনএইশন ভেরিয়েবল স্বয়ংক্রিয়ভাবে সেট হয়ে যায় যখন আমি দূরবর্তী লগ ইন করি। আমি এসএসএইচ লগইনগুলি সনাক্ত করতে, স্ক্রিনে কিছু তথ্য প্রদর্শন করতে এবং সবচেয়ে গুরুত্বপূর্ণভাবে, /etc/environmentসংকলিত ইন মানগুলি প্রতিস্থাপন করতে গ্লোবাল পরিবেশের সেটিংস লোড করার জন্য একটি নতুন শেল প্রোফাইল কনফিগারেশন তৈরি করেছি । দয়া করে মনে রাখবেন এটি কেবল ইন্টারেক্টিভ এসএসএইচ শেলগুলিকেই প্রভাবিত করে, দূরবর্তী কমান্ড প্রয়োগের ক্ষেত্রে নয়।

বিকল্পভাবে , আপনি যদি ওপেনশ ব্যবহার করেন এবং সর্বদা বিশ্বব্যাপী পরিবেশটি লোড করতে চান তবে এটি একটি ইন্টারেক্টিভ শেল কিনা তা বিবেচনা না করেই আপনি এখানে একটি সিমিলিংক রাখতে ~/.ssh/পারেন:

ln -s /etc/environment ~/.ssh/environment

তারপরে আপনাকে PermitUserEnvironmentবিকল্পটি সক্রিয় করতে হবে /etc/sshd/sshd_config। শুধুমাত্র বিশ্বস্ত ব্যবহারকারীদের জন্য এটি করুন, কারণ এটি তাদের LD_PRELOAD এর মতো প্রক্রিয়া ব্যবহার করে কিছু কনফিগারেশনে অ্যাক্সেস বিধিনিষেধকে বাইপাস করতে সক্ষম করতে পারে। দয়া করে man sshd_configআরও তথ্যের জন্য দেখুন, Matchনির্দিষ্ট ব্যবহারকারী / গোষ্ঠীগুলিতে সীমাবদ্ধ বিকল্পগুলি কীভাবে ব্লকগুলি ব্যবহার করবেন specifically


0

আপনি যদি প্রোফাইলের পথটি লোড করতে চান তবে চেষ্টা করুন:

#!/bin/bash -i

স্ক্রিপ্টের শীর্ষে। স্ক্রিপ্টটি চালানোর সময় শেলটি ইন্টারেক্টিভ মোডে থাকে।

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

http://linux.die.net/man/1/bash

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