Ssh লগইনে আমি কীভাবে স্বয়ংক্রিয়ভাবে ডিরেক্টরি পরিবর্তন করতে পারি?


87

আমি sshলগ ইন করার সাথে সাথে একটি বিশেষ ডিরেক্টরিতে স্বয়ংক্রিয়ভাবে পরিবর্তনের চেষ্টা করছি following নীচের নির্দেশিকাগুলি ব্যবহার করে সেই আচরণটি চেষ্টা করার চেষ্টা করেছি ~/.ssh/config:

Host example.net
LocalCommand "cd web"

তবে যখনই আমি লগ ইন করি, আমি নিম্নলিখিতগুলি দেখতে পাই:

/bin/bash: cd web: No such file or directory

যদিও webআমার হোম ডিরেক্টরিটিতে অবশ্যই একটি ফোল্ডার রয়েছে। এমনকি একটি নিখুঁত পথ ব্যবহার করা একই বার্তা দেয়। পরিষ্কার cd webহয়ে উঠতে, আমি লগ ইন করার পরে যদি টাইপ করি তবে আমি ডান ফোল্ডারে যাব।

আমি এখানে কি মিস করছি?

সম্পাদনা করুন:

উদ্ধৃতি / নিখুঁত পাথের বিভিন্ন সংমিশ্রণ বিভিন্ন ত্রুটি বার্তা দেয়:

LocalCommand "cd web"
/bin/bash: cd web: No such file or directory

LocalCommand cd web
/bin/bash: line 0: cd: web: No such file or directory

LocalCommand cd /home/gareth/web
/bin/bash: line 0: cd: /home/gareth/web: Input/output error

এটি আমাকে ভাবতে বাধ্য করে যে কোটগুলি সেখানে থাকা উচিত নয় এবং সেখানে আরও একটি ত্রুটি ঘটছে।


9
লোকালকমন্ড আপনার স্থানীয় সিস্টেমে চালিত হয়, দূরবর্তী সিস্টেমে নয়।
স্টিভ কেহলেট

উত্তর:


25

সিডি হ'ল একটি শেল বিল্টিন। লোকালকমন্ড এইভাবে কার্যকর করা হয়:

/bin/sh -c <localcommand>

আপনি যা করতে চাইছেন তা আসলে এসএসএইচের মাধ্যমে সম্পন্ন করা যায় না; আপনাকে শেলটি কিছু উপায়ে পরিবর্তন করতে হবে, যেমন: বাশার্ক / বাশ_প্রফাইলে।

<সম্পাদনা প্রায় এক দশক পরে ...>

LocalCommandযাই হোক না কেন, আপনি চান না। এটি আপনার মেশিনে চালানো । আপনি চান RemoteCommand। এরকম কিছু আমার জন্য কাজ করেছে:

Host example.net
  RemoteCommand cd / && exec bash --login
  RequestTTY yes

1
হ্যাঁ, কেবল একই উল্লেখ করতে চেয়েছিলেন। পরিবর্তে আপনি রিমোট সার্ভারে cdকমান্ডটি রাখতে পারেন ~/.bashrc
vdboor

ওইটা বিরক্তিকর. আমি অন্য মন্তব্যে যেমন উল্লেখ করেছি, সার্ভারের বেশ কয়েকটি হোস্ট-নেম রয়েছে এবং আমি ব্যবহার করতে পারি তার ভিত্তিতে ভিন্ন আচরণ করতে চাই। আমার ধারণা অনুমান করা সম্ভব যে .bashrc থেকে কোনটি ব্যবহৃত হয়েছিল তা নির্ধারণ করা সম্ভব নয়?
গ্যারেথ

এটা সম্ভব, সম্ভবত সম্ভবত পরামর্শ দেওয়া হয় না। একটি ছোট শেল স্ক্রিপ্ট বা উপনামের সাথে এসএসএস প্রতিস্থাপনের মতো কিছু যা রফতানিযোগ্য হিসাবে ভেরিয়েবল হিসাবে হোস্টের নামটি পাস করে (একটি লা "এসএসএস -t ব্যবহারকারী @ হোস্ট 'রফতানি সংযোগস্থল = হোস্ট; বাশ - লগিন'")। তবে আপনি সত্যিই খুব অদ্ভুত অঞ্চলে প্রবেশ শুরু করছেন। সম্ভবত আরও ভাল প্রশ্ন, আপনি কেন এই আচরণ চান?
BMDan

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

77

এইটা কাজ করে:

ssh server -t "cd /my/remote/directory; bash --login"

ডিরেক্টরি উপস্থিত না থাকলে এটি তৈরি করতে:

ssh server -t "mkdir -p newfolder; cd ~/newfolder; pwd; bash --login"

আপনি যদি bashপথের শেষে যোগ না করেন তবে cdকোমন্ড চলার পরে আপনি প্রস্থান করবেন । এবং আপনি যদি যোগ না করেন --loginতবে আপনার ~/.profileউত্সাহিত নয়।


এটি আমাকে ব্যাশ প্রম্পট সহ সঠিক স্থানে পৌঁছে দেয়। পারফেক্ট!
পিটার এহরলিচ

এটি আমার পক্ষেও কাজ করে তবে আমি যদি এসএসপি জাম্প-হোস্ট দিয়ে এটি ব্যবহার করার চেষ্টা করি তবে এটি কার্যকর হয় না। আমি একটি সংযোগ বন্ধ বার্তা পেয়েছি।
রিকার্ডো

43
  1. আপনার বাক্সে লগইন করুন
  2. সম্পাদন করা ~/.bash_profile
  3. ফাইল শেষে অ্যাড cd /path/to/your/destination
  4. এটি সংরক্ষণ করুন এবং প্রস্থান করুন
  5. বাক্স থেকে লগআউট করুন
  6. আবার লগইন করুন এবং আপনার অবতরণ করা উচিত /path/to/your/destination

3
কিছু মেশিনে আপনার পরিবর্তে সংযোজন cd /path/to/your/destinationকরা প্রয়োজন ~/.bashrcহতে পারে ~/.bash_profile। ফলাফল একই হওয়া উচিত।
ম্যাথিয়াস

এটি পুরোপুরি ধন্যবাদ কাজ করে - এটি কি কেবলমাত্র আমার ব্যবহারকারী আইডিতে সীমাবদ্ধ বা এটি অন্যের ব্যবহারকারীর লগইনগুলিকেও প্রভাবিত করবে?
হার্ড_কর্মিং_এ

আপনি যদি সংশোধন করেন ~/.bash_profileবা ~/.bashrcএটি কেবল বর্তমান ব্যবহারকারীর উপর প্রভাব ফেলবে তবে @ বাবিগ্রুট @
রুবেনভেরেলা

5

যখন আপনার ডিফল্ট .bashrc ফাইলটি স্যাশ এবং ওভাররাইড করতে হবে তখন মামলার আরও শক্তিশালী সমাধান। দূরবর্তী সার্ভার পরিবেশে একাধিক ডক্রোট রয়েছে এবং একাধিক ব্যবহারকারীর দ্বারা ব্যবহৃত হয় এটি ক্ষেত্রে এটি কার্যকর।

alias ssh_myserver='ssh server_name -t "echo cd /path/to/desired/dir>/tmp/.bashrc_tmp; bash --rcfile /tmp/.bashrc_tmp"'

আরো বিস্তারিত:

  1. প্রথম কমান্ড একটি সামগ্রী সহ দূরবর্তী সার্ভারে ডিরেক্টরিতে .bashrc_tmpফাইল তৈরি করে/tmpcd /path/to/dir
  2. পরবর্তী কমান্ড executes bashপদক্ষেপ 1. এই আকাঙ্ক্ষিত Dir স্যুইচ এবং ডিফল্ট দমন করার অনুমতি দেয় উল্লেখিত কনফিগ ফাইলের সাথে .bashrc
  3. এই পুরো কমান্ডটি একটি হিসাবে আবৃত alias, সুতরাং ssh ক্লায়েন্ট কমান্ড প্রম্পটে এটিকে বলা যেতে পারেssh_myserver

ক্রিয়েটিভ ... যতক্ষণ না আপনি /
টেম্পে পার্মস লিখেছেন

4

আপনি কি আপনার ssh কনফিগারেশনে এই নির্দেশকে সক্ষম করেছেন?

PermitLocalCommand yes

এর জন্য ডিফল্ট হ'ল no, সেই ক্ষেত্রে আপনার LocalCommandনির্দেশকে উপেক্ষা করা হবে।

বিকল্পভাবে, আপনি কি আপনার .bashrcফাইলটিতে কমান্ড যুক্ত করার চেষ্টা করেছেন ?


এই নির্দেশটি সেট করা আছে, হ্যাঁ (এবং আমি ধরে নিয়েছি ত্রুটি বার্তাটি যদি তা না দেখানো দেখি তবে) would .Bashrc ব্যবহার করে সমস্যাটি হ'ল সার্ভারটির বিভিন্ন হোস্টের নাম রয়েছে এবং আমি বিভিন্ন হোস্টের নামটি বিভিন্ন সূচনা ডিরেক্টরিতে অনুবাদ করতে চাই
গ্যারেথ

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

4

তাই আমি প্রচুর ওয়েবসাইট অনুসন্ধান করেছি (স্ট্যাকওভারফ্লো, এটি) তবে আমি যা চেয়েছিলাম তা খুঁজে পেলাম না। আমি আমার নিজের শেল স্ক্রিপ্ট তৈরি করে শেষ করেছি। আমি এটি এখানে আটকানো হয়। এছাড়াও আপনি এটিকে directory PATH তে একটি ডিরেক্টরি অনুলিপি করতে পারেন।

#!/bin/bash
ssh -t <username@hostname> "cd ~/$1; exec \$SHELL --login"

সুতরাং এই পরে। আমি করি:

connect <foldername>

দ্রষ্টব্য: পাথ ভেরিয়েবল পরিবর্তন করার পরে আপনাকে লগ আউট এবং আবার লগ ইন করতে হতে পারে


আমি এটি পূর্ববর্তী পরামর্শের চেয়ে পছন্দ করি কারণ 'EL শেল' সর্বদা বৈধ, তবে 'বাশ' নাও থাকতে পারে। এছাড়াও 'এক্সিকিউটিভ' এর ব্যবহারটি একটি দুর্দান্ত স্পর্শ।
ডেভ

আরও একটি পরিমার্জন নিশ্চিত করা হবে যে 'সিডি' সফল - "সিডি ~ / $ 1 && exec ... '
ডেভ

3

আপনার ~/.ssh/config:

LocalCommand echo '/home/%r/some/subdir' > /home/%r/.ssh/ssh_cd

আপনার শেষে ~/.bashrc:

if [[ -f $HOME/.ssh/ssh_cd ]]
then
    cd $(<$HOME/.ssh/ssh_cd)
    # uncomment the line below and the file will be removed so the cd won't work
    # unless the file is regenerated since you may not want this to operate for
    # non-ssh logins or for ssh logins that you want to function differently
    # rm $HOME/.ssh/ssh_cd
fi

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

আপনি যা করার চেষ্টা করছেন তা পরীক্ষা করার সময় আমি যখন উদাতীত পরম পথটি ব্যবহার করি তখন কোনও ত্রুটি পাইনি। আমি ; pwdকমান্ডের শেষে যুক্ত করেছি এবং সঠিক ডিরেক্টরি প্রদর্শিত হবে, তবে আমি যে ডিরেক্টরিটি শেষ করছি তা ~cdআমার শেল স্টার্টআপ ফাইলগুলিতে কোনও আদেশ নেই । আমি একটি ভিন্ন নির্বাণ চেষ্টা cd somedir; pwdমধ্যে ~/.ssh/rc(জায়গায় এখনো অন্যান্য সহ)। configমোড জারি হওয়ার পরে কমান্ডটি কার্যকর করা হয় এবং rcকমান্ডটি পরে জারি করা হয় তবে শেল স্টার্টআপ ফাইলগুলি উত্সাহিত করার আগে। আবার, এটি অন্য শেলের মধ্যে ঘটছে।

পাস-বাই-ফাইল কৌশলটি ব্যবহার করে দেখুন এবং এটি আপনার পক্ষে কাজ করে কিনা তা আমাকে জানান।


2

আপনি কি তার চারপাশের উদ্ধৃতিগুলি না দিয়ে চেষ্টা করে দেখেছেন? কেবলমাত্র যে উদাহরণগুলি আমি দেখেছি সেগুলিতে সেগুলি নেই তাই এটি একটি কমান্ড হিসাবে সিডি-ওয়েব চালানোর চেষ্টা করতে পারে।


ঠিক আছে, উদ্ধৃতিগুলি মুছে ফেলা সাহায্য করবে বলে মনে হচ্ছে তবে আমার এখনও ত্রুটি রয়েছে (সম্পাদিত পোস্ট দেখুন)
গ্যারেথ

1

আপনি এই বিকল্পটিও ব্যবহার করে দেখতে পারেন -t:

ssh server -t "cd /my/remote/directory; bash"

1

RemoteCommandপরিবর্তে ব্যবহার করার চেষ্টা করুন , যেমন

Host myhost
  HostName IP
  User ubuntu
  IdentityFile ~/.ssh/id_rsa
  RemoteCommand cd web; $SHELL -il

RemoteCommand: সার্ভারের সাথে সফলভাবে সংযুক্ত হওয়ার পরে দূরবর্তী মেশিনে চালিত করার জন্য একটি কমান্ড নির্দিষ্ট করে। ( man ssh_config)

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