Ssh এর সাহায্যে আপনি কীভাবে প্রস্থান না করে দূরবর্তী মেশিনে একটি কমান্ড চালাতে পারেন?


29

সাধারণত, আপনি যদি এরকম ssh করতে একটি আদেশ পাস করেন

ssh me@example.com 'some-command.sh'

আপনি একটি অ-ইন্টারেক্টিভ সেশন পান এবং কমান্ডটি (বা স্ক্রিপ্ট, বা যাই হোক না কেন) চালানোর সাথে সাথে ssh প্রস্থান করে। আমি কীভাবে একটি ইন্টারেক্টিভ সেশন পেতে পারি এবং এখনও আমার স্থানীয় মেশিন থেকে নির্দিষ্ট করা একটি কমান্ড চালাতে পারি। উদাহরণস্বরূপ, আমি স্ক্রিনটি খুলতে এবং নির্দিষ্ট স্ক্রিন সেশনটি পুনরায় চালু করতে সক্ষম হতে চাই:

ssh me@example.com 'screen -r 12345'

তবে এটি অনুমোদিত নয়, ত্রুটিটি ফিরিয়ে "" অবশ্যই একটি টার্মিনালের সাথে সংযুক্ত থাকতে হবে। " আমি অনুমান করি যার মূলত অর্থ "অবশ্যই একটি ইন্টারেক্টিভ শেল থেকে এই আদেশটি কল করতে হবে"।

অন্য উদাহরণ হিসাবে, আমি কাজের জায়গায় একটি টন মেশিন ব্যবহার করি যা প্রায়শই আমাকে নির্দিষ্ট কিছু কাজের অধিকার থাকার জন্য একটি শেয়ার্ড অ্যাকাউন্ট ব্যবহার করা প্রয়োজন (হ্যাঁ আমি জানি: খারাপ ধারণা কিন্তু আমাকে দোষ দেবেন না, আমি জিনিসগুলি সেট আপ করি নি) উপায়), এবং তাদের সাধারণত ডিফল্ট শেল হিসাবে ksh থাকে। আমি লগ ইন করতে, ব্যাশ (বা zsh) এ স্যুইচ করতে এবং আমার নিজের অ্যাকাউন্টের .bash_profile (বা .zshrc) উত্স করতে চাই। এটি সহজ হবে যদি আমি একটি ইন্টারেক্টিভ ssh সেশন স্থাপন করতে পারি এবং লগইন চালানোর জন্য দূরবর্তী মেশিনে একটি আদেশ পাঠাতে পারি।

আমি পোস্ট করব যে মনের একটি খুব ক্লডজি (এবং অনির্ধারিত) সমাধান আছে তবে আমি আশা করছি যে আরও ভাল কোনও উপায় জানেন।

আপডেট: যাঁরা এটি বুঝতে পারেন নি, তাদের পক্ষে আমি এই সমস্ত কাজ করার পরিকল্পনা করছি না, তাই আমাকে ইন্টারেক্টিভ সেশনটি খুলতে বলার পরে হাতে করে আসলে বাস্তবে কোনও সমস্যার সমাধান হয় না।

২ য় আপডেট: আবারও স্পষ্ট করার চেষ্টা করার জন্য: আমি সার্ভারে (স্বেচ্ছাসেবী) কমান্ডগুলি চালানোর চেষ্টা করছি (প্রোগ্রামটিমেটিকভাবে ক্লায়েন্টের উপরে নির্দিষ্ট করা) তবে তারপরে একটি ইন্টারেক্টিভ সেশন খোলা থাকে যা সেই প্রোগ্রামিক কমান্ড দ্বারা যে কোনও কিছু দ্বারা প্রভাবিত হয়।


echo "command" | ssh user@remote_host
laggingreflex

2
আপনি প্রশ্নের "অংশ ছাড়াই" মিস করেছেন? আমি নিশ্চিত যে কমান্ড শেষ হওয়ার পরে এটি প্রস্থান করবে।
আইকনোক্লাস্ট

উত্তর:


26

ব্যাশ শুরু করার জন্য আপনি নীচের কমান্ডটি চেষ্টা করতে পারেন এবং আপনি যখন ssh করবেন তখন আপনার নিজস্ব প্রোফাইল উত্স:

ssh  -t hostname "bash --rcfile ~user/.bashrc"

4
+1 টি। -tসুইচ সঙ্গে প্রশ্নকারী এর সমস্যা সমাধান করা হয়েছে screenপাশাপাশি।
প্যাচগুলি

3
সংযোগটি বন্ধ না করে এটিকে নির্বিচারে কমান্ড দিয়ে ব্যবহার করা যেতে পারে? যদি আমি চেষ্টা করি ssh -t www.dev "echo 'hi there'", কমান্ডটি কার্যকর হওয়ার পরে সংযোগটি অবিলম্বে বন্ধ হয়ে যায়।
আইকনোক্লাস্ট

11

ডগবানের উত্তরে বিল্ডিং করা, একটি সম্পূর্ণ সমাধান এরকম দেখাচ্ছে:

ssh -t user@server 'cd /a/great/place; bash'

আমি এখানে -tছদ্ম-টার্মিনাল বরাদ্দ করার জন্য ব্যবহার করি যা একটি ইন্টারেক্টিভ শেলের জন্য প্রয়োজনীয়। তারপরে আমি সার্ভারে দুটি কমান্ড কার্যকর করি: প্রথমটি আমি ইন্টারেক্টিভ শেলটি খোলার আগে যা করতে চেয়েছিলাম (আমার ক্ষেত্রে, একটি নির্দিষ্ট ফোল্ডারে ডিরেক্টরি পরিবর্তন করা) এবং তারপরে ইন্টারেক্টিভ শেলটি নিজেই। বাশ দেখতে পান যে এটিতে সিউডো-টার্মিনাল রয়েছে এবং ইন্টারেক্টিভভাবে প্রতিক্রিয়া জানায়।

একক উদ্ধৃতি নিশ্চিত করে যে আপনার ডিফল্ট শেল দ্বারা চালিত কমান্ড হিসাবে পুরো জিনিসটি দূরবর্তী সার্ভারে পৌঁছেছে।

আবার কুকুরকে ধন্যবাদ জানাতে প্রয়োজনীয় প্রচ্ছদ সরবরাহ করার জন্য -t। আমি এই সমস্যাটি সমাধান করতাম expect, যা একটি কামান দিয়ে অবশ্যই একটি মাউসকে হত্যা করছে। (:


2

এই সমাধান চেষ্টা করুন।

echo "command" | ssh user@remote_host

লগইনটি ইন্টারেক্টিভ এবং আপনার কমান্ডটি এমনভাবে পাস করা হয় যেন আপনি এটি ইন্টারেক্টিভ কমান্ড লাইনে টাইপ করেন। সেশনটি এমনভাবে সমাপ্ত হয় যেন আপনি টাইপ করেছেন

ssh user@remote_host 'command'

3
কমান্ডটি সম্পূর্ণ হওয়ার পরে যদি সেশনটি সমাপ্ত হয়, তবে এটি প্রশ্নের উত্তর দেয় না । কমান্ডটি কার্যকর করার পরে কমান্ডের পুরো পয়েন্টটি একটি ইন্টারেক্টিভ সেশন দিয়ে রেখে দেওয়া হবে, কেবল সার্ভারের মাধ্যমে কমান্ড প্রেরণ করা নয়ssh
আইকনোক্লাস্ট

আপনার বাশ ফাইল ব্যবহার না করে বা কমান্ডটি কার্যকর করতে কমান্ডের জন্য ইন্টারেক্টিভ অনুকরণের জন্য এটি অন্তত ভাল -t। +1
22-10 '

0

টার্মআইও সেন্টিমিডি ব্যবহার করতে ssh -X ব্যবহার করুন।

এছাড়াও - আপনি আপনার সেমিডিএসগুলিকে "ssh 'উত্স। / .Bashrc &&d; CD && do' এর মতো চেইন করতে পারেন"


তবে পুরো চেইনটি শেষ হওয়ার পরে, আমার একটি ইন্টারেক্টিভ সেশন বাকি নেই, তাই না? এটি এখনও বন্ধ, তাই না?
আইকনোক্লাস্ট 16

এবং আপনি কি এই শব্দটির সমাধানের শব্দটি বিস্তারিতভাবে বিবেচনা করবেন?
আইকনোক্লাস্ট 16

0

দূরবর্তী সিস্টেমে বিচ্ছিন্নতা কেন ইনস্টল করবেন না এবং ব্যবহার করুন:

ssh -t user@example.com "/home/user/bin/detach ls"

এটি কি 'ls' চালাবে এবং তারপরে আমাকে একটি ইন্টারেক্টিভ সেশনে রেখে যাবে? কী, যদি 'ls' এর পরিবর্তে, আমি কিছু উত্স এবং ফাংশন পেতে 'উত্স। সোসাইফাইল' চালাই। সেগুলি কি আমার ইন্টারেক্টিভ সেশনে উপলব্ধ হবে, না এটি অন্য একটি অধিবেশনটির অধীনে পরিচালিত হবে?
আইকনোক্লাস্ট

না, কারণে detach, lsসেশনটি উন্মুক্ত রাখে না এবং এর আউটপুট প্রিন্ট না করে সংযোগ বিচ্ছিন্ন হবে lsতবে এটি এখনও চলবে।
ড্যান ডি

আমি সার্ভারে (স্বেচ্ছাসেবী) কমান্ডগুলি চালানোর চেষ্টা করছি (প্রোগ্রামটিমেটিকভাবে ক্লায়েন্টের উপরে নির্দিষ্ট করা) তবে তারপরে একটি ইন্টারেক্টিভ সেশন খোলা থাকে যা সেই প্রোগ্রামিক কমান্ড দ্বারা যে কোনও কিছু দ্বারা প্রভাবিত হয়। সুতরাং আমি যদি আপনাকে সঠিকভাবে বুঝতে পারি তবে এটি আমার কোনও উপকার করে না।
আইকনোক্লাস্ট

0

ল্যাগিংরেফ্লেক্সের উত্তরটি নিকটে ... আমি এটিকে নিম্নরূপে পরিবর্তন করব:

echo "command\n$(cat -)" | ssh user@remote_host

দুর্ভাগ্যক্রমে, আপনি যেভাবে কাজ করেন তা পছন্দ করার মতো সম্ভাবনা নেই, কারণ 'বিড়াল' স্টাডাউটকে যে লাইনগুলি লিখেছে তা বাফার করে ... যদি আমরা "ইকো-বিড়াল" নামে একটি স্ক্রিপ্ট তৈরি করি যা দেখতে এরকম কিছু দেখায়:

{
  echo "${@}"
 #cat buffers & won't flush to stdout immediately
 #cat -
  IFS='\n'
  while read line
  do
        echo "${line}"
  done
}

বাফারিং ছাড়াই আমরা একই ফল পাব:

echo-cat "command" | ssh user@remote_host

এটি সম্ভবত আপনাকে আপনার উদ্দেশ্য থেকে অনেক কাছাকাছি আনবে ...


0

এটি ক্লদ্গেই এবং অরক্ষিত, তবে আমি মনে করি এটি কাজ করা উচিত।

(উদাহরণস্বরূপ) রিমোট-স্টারটার নামের একটি স্ক্রিপ্ট তৈরি করুন যা ব্যবহারকারী @ হোস্ট আর্গুমেন্টের পরে উদ্ধৃত যুক্তি নেয়:

remote-starter user@example.com 'some-command.sh arg1 arg2'

এই স্ক্রিপ্টটি প্রথমে .onetimeরিমোট মেশিনে (উদাঃ) নামের ফাইলটিতে উদ্ধৃত কমান্ড (উদ্ধৃতি ব্যতীত) সংরক্ষণ করবে এবং তারপরে একটি নিয়মিত ssh কমান্ড চালাবে, এবার রিমোট মেশিনে চালানোর জন্য কোনও কমান্ড পাস না করে। (যদি কোনও স্ক্রিপ্টের মধ্যে থেকে ssh user@example.com চালানো হয় তবে এটি এক্সিকিউট ssh user@example.com চালানোর জন্য কাজ করতে পারে))

এটি কাজ করার জন্য, রিমোট মেশিনটি অবশ্যই .onetimeতার .bash_profile বা .zshrc বা যে কোনও কিছু থেকে উত্স উত্স করে । দৌড়ানোর পরে .onetime, এটি মুছে ফেলা উচিত .onetime, সুতরাং যখন আপনি নিয়মিত লগইন করবেন নিম্নলিখিত সময়টি ফাইলটি চালিত হয় না।

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