কোনও সিস্টেমে লগইন করার পরে কীভাবে বাশ রিডলাইনটি vi মোডে সেট করবেন?


9

আমার দলটি কয়েক হাজার লিনাক্স / ইউনিক্স মেশিনের জন্য দায়ী, তাই স্বাভাবিকভাবেই মূল অ্যাকাউন্টটি প্রশাসকদের মধ্যে "ভাগ করা" হয় " আমি ভিআই মোড পছন্দ করি, অন্যরা ইমাস মোড পছন্দ করে।

অন্য সকলকেও ভিআই মোড ব্যবহার করতে বাধ্য না করে আমি যে কোনও মেশিনে এসএসএইচ লগইন করার পরে বাশের রিডলাইনটি ভিআই মোডে সেট করতে পারি?

set -o viপ্রকৃতপক্ষে প্রতিবার এটি টাইপ না করে লগইন করার পরে এবং অন্য সবার উপরে চাপ না দিয়ে এর প্রভাব ফেলতে চায় (ইমাস মোড যতটা আমাকে বিরক্ত করে, vi মোড তাদের কাছে বিরক্তিকর হয়)।

আমি জানি যে এই সমস্যাটি হবে না যদি প্রত্যেকে সুবিধাপ্রাপ্ত কমান্ডগুলি কার্যকর করতে sudo দিয়ে নিজস্ব অ্যাকাউন্টগুলি ব্যবহার করে তবে আমার নিয়ন্ত্রণের বাইরে অবস্থার কারণে এটি দুঃখের সাথে একটি বিকল্প নয়।


1
এটা সহজ নয়। একটি উপায় হ'ল sshd এর লগ ফাইলটি পার্স করা এবং কোন কীটি লগ ইন করার জন্য ব্যবহৃত হয়েছিল তা দেখার জন্য I কিছু অন্ধকার ওপেনএসএসএইচ ম্যাজিক যা set -o viআমাকে শেলের নিয়ন্ত্রণ দেওয়ার আগে নিঃশব্দে কার্যকর করে ।
প্যাট্রিক

1
হতে পারে আপনি ক্লায়েন্টের একটি প্রত্যাশা স্ক্রিপ্ট ব্যবহার করতে পারেন যা সার্ভারে ssh রয়েছে, set -o viকমান্ডটি প্রেরণ করুন , তারপরে ইন্টারেক্টিভ মোডে স্যুইচ করুন।
বারমার

1
কমপক্ষে ওপেনএসএইচ sshdবেশ কয়েকটি পরিবেশের ভেরিয়েবল সেট আপ করে যা আপনাকে অন্য প্রান্তে কে তা নির্ধারণ করতে সহায়তা করতে পারে। উদাহরণস্বরূপ, SSH_CLIENTসংযুক্ত আইপি-ঠিকানা রয়েছে (এবং ক্লায়েন্টের আউটগোয়িং / ইনকামিং পোর্ট)। এটিতে সজ্জিতকরণ ~/.bashrcআপনাকে কেবল আপনার জন্য কাজ করতে দেয়
সামি লাইন

1
অনুগ্রহ জানায় যে আপনি একটি "ক্লায়েন্ট সাইড সলিউশন" খুঁজছেন - এটি কী? একটি ইউনিক্স হোস্টে ssh? পুটিং? হামিংবার্ড? জাভা এসএসএইচ? Cygwin?
জেফ শ্যাচলার

1
আপনি কয়েক হাজার মেশিনের উল্লেখ করেছেন। আপনি কি একটি মেশিন থেকে শুরু করে এই মেশিনগুলিতে যেতে চান, বা আপনি কী আপনার সাথে মেশিন থেকে মেশিনে ভিআই মোড বহনকারী মেশিনে যেতে সক্ষম হতে চান?
আইক্রাস

উত্তর:


3

এটি করার একটি নির্বোধ উপায়, যা সত্যই কেবল সর্বজনীন-কী প্রমাণীকরণের সাথে ভালভাবে কাজ করে:

প্রথমে আপনার স্থানীয় মেশিনটি এতে রয়েছে তা নিশ্চিত ncকরুন।

দ্বিতীয়ত, এখনও আপনার স্থানীয় মেশিনে, একটি স্ক্রিপ্ট তৈরি করুন (আমি এটি কল করব connect-to-server) এবং এটির জায়গায় রাখুন ${PATH}যেটি আপনার সম্পর্কে *:

#!/bin/sh
# connect-to-server
ssh -q server-hostname "touch .yourname" </dev/null >/dev/null 2>&1
nc server-hostname 22

এরপরে, .bashrcরিমোট সিস্টেমে কোনওটি অন্তর্ভুক্ত করতে সংশোধন করুন :

# partial .bashrc
if [ -f "${HOME}/.yourname" ]; then
  rm "${HOME}/.yourname"
  set -o vi
fi

শেষ পর্যন্ত, আপনার স্থানীয় মেশিনে ফিরে আসার ~/.ssh/configজন্য সম্পাদনা করুন:

# partial ssh config
Host serverNickname
  Hostname server-hostname
  ProxyCommand connect-to-server

এই পদ্ধতির ডাউনসাইড (এবং কেন আমি একে নির্বোধ বলি):

  • যদি প্রকৃত প্রক্সি কমান্ডের প্রয়োজন হয় তবে এটি আরও জটিল হয়ে ওঠে।
  • আপনি যদি একই সময়ে অন্য কেউ লগইন করেন, তবে .yournameফাইলটি এখনও মুছে ফেলা হবে না এমন একটি সম্ভাবনা রয়েছে, সেই ক্ষেত্রে তারাও তা অর্জন করে set -o vi
  • সবচেয়ে গুরুত্বপূর্ণ, যদি আপনি এটি করেন ssh serverNickname commandতবে commandএটি চলবে, তবে (যেহেতু .bashrcকখনই এটি উত্সাহিত হয় না) .yournameফাইলটি রয়ে যায়, তাই আপনার ssh কনফিগারেশনে একটি দ্বিতীয় এলিফ থাকা উচিত যা সিউডো-প্রক্সি ব্যবহার করে না pol

আসলে, এই পদ্ধতির একমাত্র উত্সাহটি হ'ল আপনার sshকমান্ডকে কোনও অতিরিক্ত যুক্তি দেওয়ার দরকার নেই to


* যদি আপনি রিমোট সিস্টেমে কিছু পরিবর্তন করতে না চান, এখানে একটি বিকল্প সিউডো-প্রক্সি যা একটি অস্থায়ী তৈরি করে .bashrc:

#!/bin/sh
# connect-to-server
ssh -q server-hostname 'ln .bashrc .bashrc.real; cat .bashrc.real <(printf "set -o vi; ln -f .bashrc.real .bashrc\n") >.bashrc.yourname; ln -f .bashrc.yourname .bashrc' </dev/null >/dev/null 2>&1
nc server-hostname 22

এটি অন্যান্য পদ্ধতির সমস্ত একই অসুবিধা রয়েছে, সুতরাং আপনি এখনও আপনার sshকনফিগারেশনে একটি দ্বিতীয় উপন্যাস চাইবেন যা সিউডো-প্রক্সিটি চালিত করবে না।


খুবই সৃজনশীল. আপনার পরামর্শের জন্য ধন্যবাদ। আমি ইতিমধ্যে ব্যাপকভাবে প্রক্সিকম্যান্ড ব্যবহার করি (কিছু নেটওয়ার্ক / হোস্টগুলিতে পৌঁছতে 5+ হুপের প্রয়োজন হয়) এবং এটির ফলে একটি কনফিগারেশন দুঃস্বপ্নের ফলস্বরূপ ঘটে। সম্পাদনা করুন: আমি মনে করি আপনার উত্তরগুলি নিকটে এসে গেছে এমন সমস্ত উত্তর খুঁজছেন।
প্যাট্রিক

4

আমি যেতে চাই:

ssh server -t "bash --login -o vi"

তবে এটি আপনি প্রশাসক, আপনি কিছু পরিষ্কার করার চেষ্টা করতে পারেন। উদাহরণস্বরূপ, আপনি SSH ব্যবহার করতে পারে SendEnvএকটি নির্দিষ্ট পরিবর্তনশীল, ব্যবহার প্রেরণ করতে ক্লায়েন্ট সাইড বিকল্পটি AcceptEnvমধ্যে sshdকনফিগারেশন (সার্ভার প্রান্তের) এটিকে গ্রহণ করতে, এবং এই উপর ভিত্তি করে, পরিবর্তন root এর .bashrcফাইল ভেরিয়েবলের মান অনুযায়ী আচরণ সমন্বয়।

এটি sshdসমস্ত হোস্টের পাশাপাশি কনফিগারেশন পরিবর্তন করে .bashrc। ঠিক "স্ট্যান্ডেলোন" করার উপায় নয়, তবে ...


3

একটি সহজ ক্লায়েন্ট পার্শ্ব সমাধান জন্য:

alias connect='ssh -t root@server "bash -o vi"'

এটির ব্যর্থ হবে যদি রুটের শেল ইনিশিয়ালাইজেশন স্ক্রিপ্টগুলি স্পষ্টভাবে ব্যবহার করে set -o emacsবা সেট EDITORকরে emacs, বা রুটের .initrcফাইল যদি emacsকী বাইন্ডিংগুলি আহ্বান করে ।

এই উত্তরটির বাকি অংশগুলি সার্ভার-সাইড সমাধানগুলি নিয়ে উদ্বেগ প্রকাশ করে।


আপনি sshমেশিনে প্রবেশ করার পরে এটি ব্যবহার করুন sudo -i:

আপনার জন্য /root/.bashrc:

if [[ -n "$SUDO_USER" ]] && [[ -f /root/.bashrc-"$SUDO_USER" ]]; then
  source /root/.bashrc-"$SUDO_USER"
fi

এটি আপনাকে একটি ব্যক্তিগত bashrcফাইল বলা /root/.bashrc-patrickযেতে পারে যার মধ্যে আপনি নিজের পছন্দ মতো যা করতে পারেন set -o vi

আরসি ফাইলটি বাছাইয়ের জন্য কিছুটা নিখুঁত পদ্ধতির সাথে এটি মিশ্রণ করে $SSH_CLIENT:

if [[ -n "$SUDO_USER" ]]; then
  person="$SUDO_USER"
elif [[ -n "$SSH_CLIENT" ]]; then

  case "$SSH_CLIENT" in
    192.168.216.100*)  person="joe" ;;
    192.168.216.120*)  person="patrick" ;;
    192.168.216.150*)  person="lindsey" ;;
  esac

fi

if [[ -n "$person" ]] && [[ -f /root/.bashrc-"$person" ]]; then
  source /root/.bashrc-"$person"
fi

আপনি যদি একই সময় সমস্ত আইপি ঠিকানা থেকে সংযুক্ত থাকেন তবে এটি স্পষ্টতই কাজ করবে ...

আপনি যে এসএসএইচ কী ব্যবহার করছেন সেটির মন্তব্য ক্ষেত্রটি ব্যবহার করার জন্য আরেকটি পদ্ধতি, আপনি যদি এসএসএইচ এজেন্টকে সার্ভারে ফরোয়ার্ড করেন তবে তা কাজ করে:

ssh_comment="$( ssh-add -L | grep -f /root/.ssh/authorized_keys | awk '{ print $NF '} | head -n 1 )"

আপনি সার্ভারের সাথে সংযোগ করতে ব্যবহৃত কীটির জন্য মন্তব্য ক্ষেত্রটি খুঁজে বের করে। head -n 1ক্ষেত্রে আছে আপনি আপনার কী-বেশ কয়েক আছে এরকম authorized_keysফাইল।

তারপরে $ssh_commentআপনি উত্স হিসাবে একটি আরসি ফাইল বাছাই করতে ব্যবহার করতে পারেন , সরাসরি $SUDO_USERউপরোক্ত পদ্ধতির সাথে সরাসরি (যাতে মন্তব্যটিতে কোনও পথের নাম থাকলে $ssh_commentকিছু পরিষ্কারের প্রয়োজন হতে পারে), বা পদ্ধতির caseসাথে কোনও বিবৃতি দিয়ে $SSH_CLIENT


মিলে যাচ্ছে SSH_CLIENTএবং SUDO_USERআমি বর্তমানে এটি ব্যবহার করি তবে এটির জন্য সার্ভারের পার্শ্ব পরিবর্তন প্রয়োজন এবং এটি বিশেষভাবে নির্ভরযোগ্য নয়। আমি খাঁটি ক্লায়েন্ট-সাইড সমাধানের জন্য আশা করছিলাম। পরামর্শ দেওয়ার জন্য আপনাকে ধন্যবাদ।
প্যাট্রিক

3

আপনি যদি সত্যিই সার্ভারের দিকে কোনও পরিবর্তন ছাড়াই এটি করতে চান তবে হয়:

1) কিছু চালান

$ ssh user@host -t 'bash -l -o vi' 

আমি মনে করি না যে ডকুমেন্টেশন এতে খুব স্পষ্ট, তবে -o optionউল্লেখ করা হয়েছে, এবং কাজ করে বলে মনে হচ্ছে।

2) প্রত্যাশা ব্যবহার করুন:

expectস্ক্রিপ্ট:

$ cat bashsetup.expect
#!/usr/bin/expect -f 

set user [lindex $argv 0];
set host [lindex $argv 1];

spawn ssh -l $user $host
expect "$ "
send "set -o vi\n"
interact

এটি সম্পাদনযোগ্য এবং চালিত করুন:

$ ./bashsetup.expect user testhost
spawn ssh -l user testhost
[motd, blahblah...]
user@testhost ~$ set -o vi
user@testhost ~$ 

এটি ধরে নিয়েছে আপনি পাসওয়ার্ড (দূরবর্তী হোস্টের জন্য বা আপনার কীগুলির জন্য) প্রবেশ না করেই লগইন করতে পারবেন, অন্যথায় প্রত্যাশা স্ক্রিপ্টটিকে এটিকে অ্যাকাউন্টে নেওয়া উচিত। তবে প্রচুর মেশিনের সাথে আপনার ইতিমধ্যে এটি সম্ভবত রয়েছে। এছাড়াও, আমি ডলারের চিহ্ন এবং একটি জায়গার জন্য প্রত্যাশা করেছি , আপনার প্রম্পট অনুসারে এটি সম্পাদনা করুন: "# "সম্ভবত।

যদিও প্রম্পটের আগে মুদ্রিত কিছুতে সেই একই অক্ষরগুলি অন্তর্ভুক্ত থাকে তবে আপনাকে প্রত্যাশিত স্ট্রিংয়ে আরও নির্দিষ্ট কিছু অন্তর্ভুক্ত করতে হবে।

এছাড়াও, সেই স্ক্রিপ্টটি অতিরিক্ত যুক্তি দেওয়া সমর্থন করে না ssh। আপনি যদি চালানোর জন্য একটি সুস্পষ্ট কমান্ড দিতে চলেছেন তবে আপনার সম্ভবত ভিআই-মোডের প্রয়োজন নেই, তবে আপনার যদি পোর্ট টানেলিং বলতে প্রয়োজন হয় তবে এটি একটি সমস্যা হতে পারে।


তবে যে কোনও ক্ষেত্রেই, আমি সত্যিই মনে করি এটি পৃথক অ্যাকাউন্ট ( sudoবা কেবলমাত্র সরল পুরাতন ইউআইডি 0) দিয়ে টার্গেট সিস্টেমে সমাধান করা উচিত । ব্যক্তিগতকৃত কনফিগারেশন অন্যান্য অনেক ক্ষেত্রেও কার্যকর হবে এবং সাধারণভাবে আপনি সেট করতে চান এমন একগুচ্ছ কনফিগারেশন ফাইল এবং পরিবেশের ভেরিয়েবল। (বিবেচনা করুন যে অ্যাডমিনরা হয়ত এর মান $EDITOR, বা এর বিষয়বস্তু বা যে কোনও কিছুতে একমত হতে পারেন না virc))

পৃথক অ্যাকাউন্টের মাধ্যমে ব্যবহারকারীদের অপসারণ করা আরও সহজ হবে।

সমস্ত হোস্টে ফাইল সিঙ্ক্রোনাইজ করার যে কোনও উপায় আপনাকে এ জাতীয় ssh -t user@host 'patricks_shell.sh'বা এর সাথে লগইন করার অনুমতি দিয়ে তুচ্ছভাবে সমাধান করবে ssh -t user@host 'bash --rcfile patrick.rc'


আমি প্রত্যাশাটি ব্যবহার করার কথা ভেবেছিলাম, তবে আপনি ইতিমধ্যে আপনার প্রশ্নে উল্লেখ করেছেন যে সমস্যাটি প্রম্পটটি শুরু হওয়ার জন্য অনন্যতার সাথে কিছু মিলছে interact। এটি বিদ্যমান নেই, প্রোফাইলগুলি থেকে মোড / আউটপুট যেমন প্রম্পটগুলি হতে পারে তেমন আলাদা হতে পারে। যদিও পরামর্শ জন্য ধন্যবাদ।
প্যাট্রিক

1

এই গাইড অনুসরণ করে আপনার একটি কাস্টম আরসি ফাইল থাকতে পারে:

ব্যবহারকারী আরসি ফাইল | সুরক্ষিত শেল: সংজ্ঞা নির্দেশিকা

বা আপনার অনুমোদিত_কিজ ফাইলগুলিতে একটি কমান্ড লাইন ক্রিয়াকলাপটি ইনজেক্ট করুন:

এসএসএইচ কনফিগারেশন অটো চালিত দূরবর্তী কমান্ড | ইউনিক্স এবং লিনাক্স স্ট্যাক এক্সচেঞ্জ

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