এসএসএস-এর মাধ্যমে sh স্টার্টআপ ফাইল


10

আমার কাছে কিছু গুরুত্বপূর্ণ কমান্ড রয়েছে যে কোনও শ শেল শুরুর আগে আমাকে কার্যকর করতে হবে। এসএসএইচ কমান্ড ( ssh host somecommand) এবং অন্যান্য প্রোগ্রামে কমান্ড চালিত অন্যান্য প্রোগ্রামগুলিতে এসএসএইচ কমান্ডগুলি পাস করার জন্য এটি প্রয়োজনীয় ।

আমার মধ্যে এটি .profileআছে:

ihammerhands@wreckcreations:~> cat .profile
#specific environment and startup programs
export PS1="\u@wreckcreations:\w> "
export PYTHONPATH=~/python/lib/python2.4/site-packages
export PATH=$PATH:~/bin:~/python/bin

তবে, এটি ব্যর্থ:

W:\programming\wreckcreations-site\test-hg>ssh name@host echo $PATH
Enter passphrase for key '/home/Owner/.ssh/id_rsa':
/usr/local/bin:/bin:/usr/bin

অনুপস্থিত PATH বিকল্পগুলি লক্ষ্য করুন

Sh প্রোফাইলের সঠিক নামটি কী? দ্রষ্টব্য: আমার কাছে রুট অ্যাক্সেস নেই এবং এটি অন্য ব্যবহারকারীর জন্য প্রয়োগ করা চাই না। এই কাজ করার জন্য অন্য উপায় আছে কি?


সম্পাদনা: এটির /bin/shলিঙ্কগুলি উপস্থিত হয় bash, যা অবাক করার মতো নয়। অবাক করার মতো বিষয়টি হল আমার প্রোফাইলটি এখনও উপেক্ষা করা হচ্ছে। কোন পরামর্শ?


1
ম্যান পৃষ্ঠায় যা আছে তা পুনরাবৃত্তি করার মতো মনে হয় না, তাই 'ইনভোকেশন' বিভাগের অধীনে ব্যাশ ম্যান পৃষ্ঠাটি দেখুন। এটি শীর্ষের নিকটবর্তী এবং আপনাকে যা জানা দরকার তা বর্ণনা করে।
ক্যামহ

আপনি ব্যবহার করার চেষ্টা করতে পারে ssh name@host -t echo $PATH
গার্ট

@ জার্ট আউটপুট একই
TheLQ

@ ক্যামহ আপনি কি মনে করেন যে আমি যদি ইতিমধ্যে ম্যান পৃষ্ঠাগুলি পরীক্ষা করে না নিই তবে আমি এই প্রশ্নটি করব? আমি এগুলি বহুবার + অন্যান্য পোস্টে পড়েছি কিন্তু কখনই এই নির্দিষ্ট সমস্যার কোনও উত্তর খুঁজে পাইনি, কারণ আমি নিশ্চিত নই যে কোন ধাপে ssh কমান্ড এবং অন্যান্য প্রোগ্রামের আদেশগুলি কার্যকর করা হয়
TheLQ

1
@ দ্য এলকিউ: আমি আপনাকে চিনি না তাই আপনি ম্যান পেজটি পরীক্ষা করে দেখবেন কিনা তা আমি জানি না। আমি কেবল জানতাম যে উত্তরগুলি ঠিক সেখানে ছিল, তাই এটি শব্দটির জন্য শব্দটির পুনরাবৃত্তি না করে আমি আপনাকে এটিকে নির্দেশ করেছি। আরও একটি নির্দিষ্ট পয়েন্টার হ'ল আপনার ইন্টার-সিটি পরিস্থিতিটি যেহেতু অ-ইন্টারেক্টিভ শেলগুলি সন্ধান করা। ম্যান পৃষ্ঠায় কিছু পরিষ্কার না থাকলে সম্ভবত আপনি আরও নির্দিষ্ট প্রশ্ন জিজ্ঞাসা করতে পারেন।
ক্যামহ

উত্তর:


8

আপনি যে প্রশ্নটি আপনার প্রশ্নের মধ্যে উল্লেখ করেছেন তা লক্ষ্য করার মতো মনে হচ্ছে

ssh name@host echo $PATH

প্রায় দরকারী হবে না। আপনার স্থানীয় শেল দ্বারা $ PATH এর পরিবর্তনশীল প্রতিস্থাপনটি সম্পন্ন করা হয় এবং আপনার স্থানীয় সিস্টেমে প্রসারিত হওয়ার সাথে সাথে পাথের ভেরিয়েবলের বিষয়বস্তু মুদ্রণের জন্য এটি দূরবর্তী সিস্টেমে প্রতিধ্বনিত করে ssh এ চলে যায়। আমার নেটওয়ার্কে আমার ম্যাক এবং লিনাক্স মেশিনের মধ্যে আমার অনুরূপ কিছু করার একটি উদাহরণ এখানে দেওয়া হয়েছে:

LibMBP:~ will$ echo $PATH
/opt/local/bin:/opt/local/sbin:/Users/will/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/texbin:/usr/X11/bin
LibMBP:~ will$ ssh warren echo $PATH
will@warren's password: 
/opt/local/bin:/opt/local/sbin:/Users/will/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/texbin:/usr/X11/bin
LibMBP:~ will$ ssh warren 'echo $PATH'
will@warren's password: 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
LibMBP:~ will$ 

আমার স্থানীয় শেলটি ভেরিয়েবলটি প্রসারিত হতে আটকাতে কীভাবে আমার উদ্ধৃতিগুলি ব্যবহার করা দরকার তা নোট করুন।


উইন্ডোজ সাইগউইন জমিতে সিগউইন বা কমান্ড প্রম্পটে সিঙ্গল কোটগুলি কিছুই করে না। আশ্চর্যের বিষয়, ডাবল কোটগুলি PATH সাইগউইনের আমার স্থানীয় মেশিনে সম্পূর্ণরূপে প্রসারিত করে। সুতরাং
এসএসএস

@TheLQ একটি ইউনিক্স প্রম্পটে (সাইগউইন সহ) একক উক্তিগুলি প্রয়োজনীয়, তবে আপনাকে কোনও সেন্টিমিড প্রম্পটে কোনও উদ্ধৃতি দরকার নেই।
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'

12

~/.profileশুধুমাত্র লগইন শেল দ্বারা কার্যকর করা হয়। যে প্রোগ্রামটি শেলটিকে কল করে তা শেলটি লগইন শেল হবে কিনা তা সিদ্ধান্ত নেয় (শেল ডাকে -প্রার্থনায় জিরোথ আর্গুমেন্টের প্রথম চরিত্র হিসাবে)। আপনি যখন নির্দিষ্ট কমান্ড প্রয়োগ করতে লগ ইন করেন এটি সাধারণত কার্যকর হয় না।

বিশেষত ওপেনএসএইচ কেবলমাত্র যদি আপনি কোনও আদেশ সুনির্দিষ্ট না করেন তবে লগইন শেলটি আহ্বান করে। সুতরাং আপনি যদি একটি আদেশ নির্দিষ্ট করেন, ~/.profileপড়বেন না।

ওপেনএসএইচ সার্ভারের পার্শ্ববর্তী পরিবেশের পরিবর্তনশীলগুলি সেট করার অনুমতি দেয়। নির্দেশাবলী সহ এটি অবশ্যই সার্ভার কনফিগারেশনে সক্ষম করতে হবে PermitUserEnvironment। ভেরিয়েবলগুলি ফাইলটিতে সেট করা যায় ~/.ssh/environment। ধরে নেওয়া যাক আপনি সার্বজনীন কী প্রমাণীকরণ ব্যবহার করেছেন, আপনি প্রতি-কী ভেরিয়েবলগুলি এতে সেট করতে পারেন ~/.ssh/authorized_keys: environment="FOO=bar"প্রাসঙ্গিক লাইনের শুরুতে যুক্ত করুন ।

এস এস এনভায়রনমেন্ট ভেরিয়েবল প্রেরণকে সমর্থন করে। ওপেনএসএইচ-এ, SendEnvনির্দেশিকাটি ইন ব্যবহার করুন ~/.ssh/config। তবে নির্দিষ্ট পরিবেশের পরিবর্তনশীল অবশ্যই AcceptEnvসার্ভার কনফিগারেশনে একটি নির্দেশের সাথে সক্ষম করতে হবে , সুতরাং এটি আপনার পক্ষে কার্যকর নাও হতে পারে।

আমি মনে করি যে একটি জিনিস সর্বদা কাজ করে (অদ্ভুতভাবে যথেষ্ট) যতক্ষণ আপনি পাবলিক কী প্রমাণীকরণ ব্যবহার করছেন ফাইলের বিকল্পটি (আব) ব্যবহার করাcommand=authorized_keys । একটি commandবিকল্প সহ একটি কী কেবল নির্দিষ্ট কমান্ড চালানোর জন্যই ভাল; কিন্তু authorized_keysফাইলের কমান্ডটি পরিবেশিত পরিবর্তনশীল SSH_ORIGINAL_COMMANDব্যবহারকারীর দ্বারা নির্ধারিত কমান্ডটিতে চালিত হয় । এই পরিবর্তনশীলটি খালি যদি ব্যবহারকারী কোনও কমান্ড নির্দিষ্ট না করে এবং তাই একটি ইন্টারেক্টিভ শেল আশা করে। সুতরাং আপনি এ জাতীয় কিছু ব্যবহার করতে পারেন ~/.ssh/authorized_keys(অবশ্যই, আপনি যদি এই কীটি প্রমাণীকরণের জন্য ব্যবহার না করেন তবে এটি প্রযোজ্য নয়):

command=". ~/.profile; if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then eval \"$SSH_ORIGINAL_COMMAND\"; else exec \"$SHELL\"; fi" ssh-rsa 

আর একটি সম্ভাবনা হ'ল সার্ভারে একটি র‍্যাপার স্ক্রিপ্ট লিখুন। নিম্নলিখিতগুলির মতো কিছু ~/bin/ssh-wrapper:

#!/bin/sh
. ~/.profile
exec "${0##*/}" "$@"

তারপর এই স্ক্রিপ্ট নামে সিম্বলিক লিংক করা rsync, unisonইত্যাদি পাস --rsync-path='bin/rsync'উপর rsyncতাই অন্যান্য প্রোগ্রামের জন্য কমান্ড লাইন, এবং। বিকল্পভাবে, কিছু কমান্ড আপনাকে দূরবর্তী অবস্থানের জন্য পুরো শেল স্নিপেট নির্দিষ্ট করার অনুমতি দেয়, যা আপনাকে কমান্ডটি স্ব-অন্তর্ভুক্ত করতে দেয়: উদাহরণস্বরূপ, আরএসসিএনসি সহ, আপনি ব্যবহার করতে পারেন --rsync-path='. ~/.profile; rsync'

আর একটি অ্যাভিনিউ রয়েছে যা আপনার লগইন শেল বাশ বা zsh হওয়ার উপর নির্ভর করে। বাশ সর্বদা পড়তে থাকে ~/.bashrcযখন এটি আরএসডি বা এসএসডি দ্বারা চালিত হয়, এটি ইন্টারেক্টিভ না হলেও (তবে এটি হিসাবে পরিচিত না হলে sh)। Zsh সর্বদা পড়া ~/.zshenv

## ~/.bashrc
if [[ $- != *i* ]]; then
  # Either .bashrc was sourced explicitly, or this is an rsh/ssh session.
  . ~/.profile
fi

## ~/.zshenv
if [[ $(ps -p $PPID -o comm=) = [rs]shd && $- != *l* ]]; then
  # Not a login shell, but this is an rsh/ssh session
  . ~/.profile
fi

অন্যান্য কমান্ডগুলি কার্যকর করে এমন কমান্ডগুলি সম্পর্কে কী বলা যায়? এই ক্ষেত্রে এটি মার্চুরিয়াল হুক হবে। হুক এমনকি কাজ করার
চিন্তাভাবনা

আপনার প্রোফাইলটি নন-ইন্টারেক্টিভ ssh কমান্ডগুলিতে চালানোর জন্য আমি নির্দেশিত কোনও কৌশল ব্যবহার করুন। এর মধ্যে একটি ( command=ইন authorized_keys) স্বচ্ছভাবে কাজ করে। অন্যদের ssh সার্ভার কনফিগারেশনে একটি নির্দিষ্ট শেল বা বিকল্পের প্রয়োজন। এর Mercurial সমতুল্য --rsync-pathহয় --remotecmd
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'

কিছু একই পূর্ণ অন্তর্ভুক্ত করার জন্য এটা সহায়ক হতে পারে command=আপনার পোস্ট হিসেবে কমান্ড superuser.com/a/207262/137762
mforbes

1

সাধারণত লগইন করার পরে, বাশ কমান্ডগুলি পড়ে:

~ / .bash_profile
~ / .Bashrc

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

b / .bash_profile
লগইন শেলগুলির জন্য নির্বাহ করা ব্যক্তিগত সূচনা ফাইল


per / .bashrc স্বতন্ত্র প্রতি-ইন্টারেক্টিভ-শেল স্টার্টআপ ফাইল


0

এটি পরীক্ষা করার জন্য আমি খুব বেশি সময় পেলাম না, তবে আমি যে পুরুষ পৃষ্ঠাগুলি পেয়েছি তা সন্ধান করছি:

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

man ssh: vari / .ssh / পরিবেশে পরিবেশের ভেরিয়েবলের অতিরিক্ত সংজ্ঞা রয়েছে; পরিবেশ, উপরে দেখুন see

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

দুর্ভাগ্যক্রমে আমার সার্ভারে নেই এর ডিফল্ট মানটির জন্য PermitUserEnਵਰমন্ডেশন রয়েছে, যা এটি আমার পক্ষে কাজ করে না (এবং যেমন আমি বলেছিলাম যে এর সাথে আরও খেলার জন্য আমার কাছে সময় নেই)।


এমনকি যদি আমি পরিবেশে পরিবেশগত কিছু পরিবর্তনশীলগুলি স্পষ্ট করে উল্লেখ করে
এসএসএইচকে

আপনার উদাহরণে আপনি যা করছেন সেটি পরিবেশের ভেরিয়েবল নির্ধারণ করছে, আপনি আর কী করতে চান?
কাস্টারমা

0

(সরানো হয়েছে ... নতুন ব্যবহারকারী হিসাবে কেবল একটি হাইপারলিঙ্ক থাকতে পারে ~)

হালনাগাদ

দুঃখিত, আমি দেখিনি যে এটি একটি ইন্টারঅ্যাক্টিভ অধিবেশন সম্পর্কে, যা উপরের লিঙ্কটি প্রয়োগ করে না।

বাশ যখন এসএইচ কমপিটিলিটি মোডে শুরু হয়, এটি পসিক্স ® স্ট্যান্ডার্ডের সাথেও মেনে চলার পরে যতটা সম্ভব নিবিড়ভাবে ofতিহাসিক সংস্করণের প্রারম্ভিক আচরণের নকল করার চেষ্টা করে। পড়ার প্রোফাইল ফাইলগুলি হ'ল / ইত্যাদি / প্রোফাইল এবং ~ /। প্রোফাইল, যদি এটি লগইন শেল হয়।

যদি এটি লগইন শেল না হয়, পরিবেশের পরিবর্তনশীল ENV মূল্যায়ন করা হয় এবং ফলস্বরূপ ফাইলের নামটি স্টার্টআপ ফাইলের নাম হিসাবে নেওয়া হয়।

স্টার্টআপ ফাইলগুলি পড়ার পরে, ব্যাশ পসিক্স (আর) কমপিটিবিটি মোডে প্রবেশ করে (চলার জন্য, শুরু করার জন্য নয়!)।

বাশ sh compatiblity মোডে শুরু হয় যখন:

  • আরজিভি [0] এর বেস ফাইলের নামটি হ'ল শ: (:! প্রিয় উবার-চতুর লিনাক্স ব্যবহারকারীদের দিকে মনোযোগ দিন ... / বিন / শ / লিনাক্স / সংযুক্ত হতে পারে তবে এর অর্থ এই নয় যে এটি / বিন / বাশের মতো কাজ করে : :)

সুতরাং প্রশ্নটি হল, কেন এটি এটি চালায় না, যদিও আপনার শেলটি এভাবেই শুরু হয়েছিল।

সূত্র


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