bash - কিভাবে আমি সরাসরি একটি নির্দিষ্ট ডিরেক্টরি ssh করতে পারেন?



shell scripting (8)

@ Rogeriopvl এর উত্তরের সংযোজনগুলির উপর ভিত্তি করে, আমি নিম্নলিখিত প্রস্তাব দিচ্ছি:

ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && bash"

চেন্নাই কমান্ডগুলি && দ্বারা পরবর্তী কমান্ড চালানো হবে যখন পূর্ববর্তীটি সফল হয়েছিল (ব্যবহার করার পরিবর্তে ; যা ক্রম অনুসারে কমান্ডগুলি চালায়)। কমান্ড সম্পাদনকারী ডিরেক্টরিতে cd প্রয়োজন হলে এটি বিশেষত দরকারী।

নিম্নলিখিত কাজ কল্পনা করুন:

/home/me$ cd /usr/share/teminal; rm -R *

ডিরেক্টরি teminal বিদ্যমান নেই, যা আপনাকে হোম ডিরেক্টরিতে থাকতে এবং নিম্নোক্ত কমান্ডের সাথে সেখানে সমস্ত ফাইলগুলি সরাতে পারে।

আপনি যদি && ব্যবহার করেন

/home/me$ cd /usr/share/teminal && rm -R *

ডিরেক্টরী খুঁজে পাওয়ার পরে কমান্ড ব্যর্থ হবে।

https://ffff65535.com

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

localhost ~]$ ssh somehost

Welcome to somehost!

somehost ~]$ cd /some/directory/somewhere/named/Foo
somehost Foo]$ 

আমার কাছে স্ক্রিপ্ট রয়েছে যা নির্ধারণ করতে পারে কোন হোস্ট এবং কোন ডিরেক্টরিটি আমাকে পেতে হবে তবে আমি এটি করার উপায় খুঁজে পাচ্ছি না:

localhost ~]$ go_to_dir Foo

Welcome to somehost!

somehost Foo]$

একটি সহজ, চতুর বা এই ভাবে কোন উপায় আছে?


আপনি নিম্নলিখিত কাজ করতে পারেন:

ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted ; bash"

এই ভাবে, আপনি directory_wanted একটি শেল অধিকার পাবেন।

ব্যাখ্যা

-t টার্মিনাল বরাদ্দ -t ফোর্স। এটি দূরবর্তী মেশিনে অবাধ স্ক্রীন-ভিত্তিক প্রোগ্রামগুলি কার্যকর করতে ব্যবহার করা যেতে পারে, যা খুব দরকারী হতে পারে, যেমন, মেনু পরিষেবাদি বাস্তবায়ন করার সময়।

একাধিক-টি বিকল্পগুলি force tty বরাদ্দ, এমনকি এসএসএসের স্থানীয় টটি নেই।

  • যদি আপনি -t ব্যবহার করেন না তবে কোন প্রম্পট প্রদর্শিত হবে না।
  • যদি আপনি যোগ করবেন না ; bash তারপর ; bash সংযোগ বন্ধ হবে এবং আপনার স্থানীয় মেশিনে নিয়ন্ত্রণ ফিরে

আমার খুব সুনির্দিষ্ট ক্ষেত্রে, আমি কেবল একটি জেনকিন্স স্লেভ মেশিনের একটি নির্দিষ্ট ডিরেক্টরির ভিতরে রিমোট হোস্টে একটি কমান্ড চালাতে চেয়েছি:

ssh [email protected]
cd /home/myuser/somedir 
./commandThatMustBeRunInside_somedir
exit

কিন্তু আমার মেশিনটি এসএসএস সম্পাদন করতে পারে নি (এটি আমি মনে করি একটি ছদ্মবেশী টিকে বরাদ্দ করতে পারিনি) এবং আমাকে নিম্নলিখিত ত্রুটি প্রদান করে রেখেছে:

Pseudo-terminal will not be allocated because stdin is not a terminal

Ssh কমান্ডের প্যারামিটার হিসাবে (সিউডো-টার্মিনাল বরাদ্দ করতে হবে না) এবং বিকল্প-টিটি পাস করে আমি এই সমস্যাটিকে "cd থেকে dir + আমার কমান্ড" পাস করতে পারি ছদ্ম-টার্মিনাল বরাদ্দ প্রয়োজন নেই।

ssh -T [email protected] "cd /home/myuser/somedir; ./commandThatMustBeRunInside_somedir"

আমার পছন্দের পদ্ধতিটি এসএসএইচ কনফিগারেশন ফাইল (নীচে বর্ণিত) ব্যবহার করছে, তবে আপনার ব্যবহারের উপর নির্ভর করে কয়েকটি সম্ভাব্য সমাধান রয়েছে।

কমান্ড লাইন আর্গুমেন্ট

আমি মনে করি এই পদ্ধতির জন্য সর্বোত্তম উত্তর ক্রিশ্চিয়ানবন্ডিয়ের গ্রহণযোগ্য উত্তরটির উত্তর:

ssh -t example.com "cd /foo/bar; exec \$SHELL -l"

ডাবল কোট ব্যবহার করলে আপনার স্থানীয় মেশিন থেকে ভেরিয়েবলগুলি ব্যবহার করা যাবে, যতক্ষণ না তারা পালিয়ে যায় (যেমন $SHELL এখানে রয়েছে)। বিকল্পভাবে, আপনি একক উদ্ধৃতি ব্যবহার করতে পারেন এবং আপনি যে সমস্ত ভেরিয়েবলগুলি ব্যবহার করেন তা লক্ষ্য মেশিনের মধ্যে হতে পারে:

ssh -t example.com 'cd /foo/bar; exec $SHELL -l'

বাশ ফাংশন

আপনি একটি ব্যাশ ফাংশন এটি মোড়ানো দ্বারা কমান্ড সহজ করতে পারেন। আসুন আপনি শুধু এই টাইপ করতে চান বলুন:

sshcd example.com /foo/bar

আপনি এই ~/.bashrc যুক্ত করে এই কাজটি করতে পারেন:

sshcd () { ssh -t "$1" "cd \"$2\"; exec \$SHELL -l"; }

যদি আপনি ডিরেক্টরিটির জন্য দূরবর্তী মেশিনে বিদ্যমান একটি পরিবর্তনশীল ব্যবহার করেন, তবে এটি এড়িয়ে চলতে বা এটি একক উদ্ধৃতিতে রাখতে ভুলবেন না। উদাহরণস্বরূপ, এটি রিমোট মেশিনে JBOSS_HOME ভেরিয়েবলে সংরক্ষিত ডিরেক্টরিটি সিডি করবে:

sshcd example.com \$JBOSS_HOME

এসএসএইচ কনফিগারেশন ফাইল

অতিরিক্ত কমান্ড লাইন আর্গুমেন্টগুলি ব্যবহার না করে আপনি স্বাভাবিক ssh কমান্ডের সাথে নির্দিষ্ট (অথবা যে কোনও) হোস্টগুলির জন্য এই আচরণটি দেখতে চাইলে, আপনি আপনার ssh কনফিগারেশন ফাইলে RequestTTY এবং RemoteCommand বিকল্পগুলি সেট করতে পারেন।

উদাহরণস্বরূপ, আমি শুধুমাত্র এই কমান্ড টাইপ করতে চাই:

ssh qaapps18

কিন্তু এটি সর্বদা এই কমান্ডের মত আচরণ করতে চায়:

ssh -t qaapps18 'cd $JBOSS_HOME; exec $SHELL'

তাই আমি আমার ~/.ssh/config ফাইলে যুক্ত করেছি:

Host *apps*
    RequestTTY yes
    RemoteCommand cd $JBOSS_HOME; exec $SHELL

এখন এই নিয়মটি তার হোস্টনামে "অ্যাপ্লিকেশান" সহ কোন হোস্টে প্রযোজ্য।

আরও তথ্যের জন্য, http://man7.org/linux/man-pages/man5/ssh_config.5.html


আমি পরিবেশ পরিবর্তনশীল সিডিপিএটিএইচ ব্যবহার করি


এসএসএইচ নিজেই যোগাযোগের মাধ্যম সরবরাহ করে, এটি ডিরেক্টরি সম্পর্কে কিছু জানে না। যেহেতু আপনি কোন রিমোট কমান্ডটি চালাতে পারেন তা নির্ধারণ করতে পারেন (এটি - ডিফল্টরূপে - আপনার শেল), আমি সেখানে শুরু করব।


টি ধারণা সঙ্গে এক ধাপ এগিয়ে যাচ্ছে। আমি আমার ঘন ঘন পরিদর্শিত হোস্টগুলিতে নির্দিষ্ট স্থানে যাওয়ার জন্য নীচেরটিকে কল করার স্ক্রিপ্টগুলির একটি সেট রাখি। আমি তাদের সব ~/bin মধ্যে রাখা এবং আমার পাথ যে ডিরেক্টরি রাখা।

#!/bin/bash

# does ssh session switching to particular directory
# $1, hostname from config file 
# $2, directory to move to after login
# can save this as say 'con' then
# make another script calling this one, e.g.
# con myhost repos/i2c

ssh -t $1 "cd $2; exec \$SHELL --login"

লগ ইন করার পরে সরাসরি যাওয়ার আরেকটি উপায় "আলিয়া" তৈরি করা। যখন আপনি আপনার সিস্টেমে লগইন করেন তখন সেটি ওরফে টাইপ করুন এবং আপনি সেই ডিরেক্টরিতে থাকবেন।

উদাহরণ: উপনাম = myfolder '/ var / www / ফোল্ডার'

আপনার সিস্টেমে লগ ইন করার পরে ওরফে টাইপ করুন (এটি সিস্টেমের যে কোনো অংশ থেকে কাজ করে)
এই কমান্ড bashrc না হলে বর্তমান সেশনের জন্য কাজ করবে। সুতরাং আপনি ভবিষ্যতে এটি ব্যবহার করতে bashrc এ এই উপনাম যুক্ত করতে পারেন

$ myfolder => আপনাকে সেই ফোল্ডারে নিয়ে যায়






ssh