আমি কীভাবে সরাসরি কোনও নির্দিষ্ট ডিরেক্টরিতে ssh করতে পারি?


248

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

লোকালহোস্ট ~] sh ssh কোনওরকম

কোনওমতে স্বাগতম!

somehost ~] $ সিডি / কিছু / ডিরেক্টরি / কোথাও / নাম / ফুও oo
সামহোস্ট ফু] $ 

আমার কাছে এমন স্ক্রিপ্ট রয়েছে যা নির্ধারণ করতে পারে যে কোন হোস্ট এবং কোন ডিরেক্টরিতে আমাকে প্রবেশ করতে হবে তবে আমি এটি করার কোনও উপায় বের করতে পারি না:

লোকালহোস্ট ~] $ go_to_dir ফু

কোনওমতে স্বাগতম!

সামহোস্ট ফু] $

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

উত্তর:


413

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

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

এইভাবে, আপনি সরাসরি_অ্যান্টেড ডিরেক্টরিতে একটি শেল পাবেন।


ব্যাখ্যা

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

একাধিক -tবিকল্প tty বরাদ্দকে বাধ্য করে, যদিও ssh এর কোনও স্থানীয় tty নেই।

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

21
আমার ক্ষেত্রে
ম্যাথিউ

2
এই পদ্ধতির ব্যবহার করার সময় .bash_ প্রোফাইলে পড়া হয় না, কেন কেউ জানে?
ফিলিপ

8
আমাকে এটি করতে হয়েছিল: ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && exec \$SHELL"
গুপ্ত্রন

40
আপনি সাধারণত একটি লগইন শেল চাইবেন:ssh -t example.com "cd /foo/bar; exec \$SHELL -l"
খ্রিস্টিয়ানবান্ডি

10
কেবল ssh লগইনে স্বয়ংক্রিয়ভাবে পরিবর্তন ডিরেক্টরিটি লিঙ্ক করতে চেয়েছিলেন - সার্ভার ফল্ট ; এবং সেখান থেকে এই কমান্ডটি পেস্ট করুন (যা @ ক্রিশ্চিয়ানবুন্ডির এটির একটি সংস্করণ):ssh server -t "cd /my/remote/directory; bash --login"
sdaau

53

আপনি যোগ করতে পারে

cd /some/directory/somewhere/named/Foo

অন্য হোস্টে আপনার .bashrcফাইল (বা .profileআপনি যা কিছু বলুন) তে যান sshআপনি যে সার্ভারে লগইন করেন না কেন আপনি যা করেন বা আপনি কোথা থেকে এসেছেন তা গুরুত্বপূর্ণ নয়, এটি cdআপনার জন্য সঠিক ডিরেক্টরিতে চলে আসবে এবং আপনাকে যা করতে হবে তা হ'ল sshসাধারণের মতো ব্যবহার ।

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


1
+1, এটি আরও উপযুক্ত বলে মনে হচ্ছে যদি আপনি এক্স মেশিনের সাথে সংযোগ স্থাপন করেন তখন আপনি যে ডিরেক্টরিটিতে চলে যাবেন সে সম্পর্কে প্রত্যেক সময় স্মরণ করে ssh কমান্ড তৈরির পরিবর্তে ধ্রুবক ডিরেক্টরি প্রয়োজন হলে
Tebe

নমনীয়ভাবে পরিবর্তন করার সময় যথাযথ নয়
লুইস চ্যান

21

আমি এসএসএইচ এবং সিডি থেকে একটি সার্ভারে একটানা একটি সরঞ্জাম তৈরি করেছি - যথাযথভাবে sshcd নামকরণ করা হয়েছে । আপনি যে উদাহরণটি দিয়েছেন তার জন্য আপনি কেবল ব্যবহার করতে পারেন:

sshcd somehost:/some/directory/somewhere/named/Foo

আপনার যদি কোন প্রশ্ন বা সমস্যা থাকে তবে আমাকে জানান!


1
আপনি যদি config / .ssh / কনফিগারেশনে একটি নতুন কনফিগারেশন সংজ্ঞায়িত করতে এবং সেখান থেকে এটি পড়তে পারেন তবে দুর্দান্ত হবে;
আলেক্সার

21

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

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

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

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 দেখুন


13

@ রোজারিওভিএল এর উত্তরের সংযোজনের ভিত্তিতে আমি নিম্নলিখিতটি প্রস্তাব করছি:

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 *

ডিরেক্টরি না পাওয়ার পরে কমান্ডটি ব্যর্থ হবে।


1
একবারে && ছাড়াই কমান্ডের সাহায্যে একক উদ্ধৃতি এবং ডাবল কোট ব্যবহার করা হয়নি এবং এটি আমাকে বাটে চাপায়, খারাপ ... আমার পাঠ শিখেছে।
গ্যাভিন পিকিন

4

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

ssh myuser@mydomain
cd /home/myuser/somedir 
./commandThatMustBeRunInside_somedir
exit

তবে আমার মেশিনটি ssh সম্পাদন করতে পারে নি (এটি আমার মনে হয় যে এটি একটি সিডো-টিটি বরাদ্দ করতে পারে না) এবং আমাকে নিম্নলিখিত ত্রুটিটি দিয়ে চলেছে:

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

আমি এই সমস্যাটি প্রায়শই পেতে পারি ssh কমান্ডের প্যারামিটার হিসাবে "সিডি টু দির + আমার কমান্ড" (সিউডো-টার্মিনাল বরাদ্দ করতে হবে না) এবং বিকল্পটি-টি পাশ করে ssh কমান্ডকে স্পষ্ট করে বলতে হবে সিউডো-টার্মিনাল বরাদ্দ দরকার নেই।

ssh -T myuser@mydomain "cd /home/myuser/somedir; ./commandThatMustBeRunInside_somedir"

3

আমি পরিবেশ পরিবর্তনশীল সিডিপ্যাথ ব্যবহার করি


আমি কেবল মেশিনে একটি ডিরেক্টরিতে আগ্রহী হলেই দরকারী ful দূরবর্তী মেশিনে তথ্য দেওয়ার জন্য আমার একটি উপায় দরকার। রজারের সমাধানটি ঠিক তাই করে।
ফ্রস্টি

2

-tধারণাটি নিয়ে আরও একধাপ এগিয়ে । আমি আমার ঘন ঘন পরিদর্শন করা হোস্টগুলিতে নির্দিষ্ট জায়গায় যেতে নীচে কল করে স্ক্রিপ্টগুলির একটি সেট রাখি। আমি তাদের ~/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"

1

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

উদাহরণ: উপনাম = মাইফোল্ডার '/ ভেরি / www / ফোল্ডার'

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

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


-3

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


4
এটি একটি আংশিক উত্তর, কোনও সমাধান নয়।
এএল

-7

কমান্ডটি দিয়ে আপনার বাড়িতে কেবল পরিবর্তন করুন: usermod -d /newhome username


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