स्थानीय शेल उपनामों को गतिशील रूप से सत्र के लिए लोड करना


21

जब मैं किसी मशीन का उपयोग करके लॉग इन करता हूं ssh मेरी इच्छा है उपनाम तथा कार्यों वहां हैं। दूसरे शब्दों में, कुछ मशीन में लॉग इन करें मैं चाहता हूं कि मैं अपने कमांड शॉर्टकट का उपयोग कर सकता हूं।

मुझे इसकी आवश्यकता है कि यह गतिशील हो, हर बार जब मैं लॉग इन करता हूं तो मेरी इच्छा है कि मैंने उपनामों को अपडेट किया है।

टिप्पणियाँ:   बहुत बार यह पहली बार लॉग इन होता है, बिना मशीन और फाइलों को जाने।   कभी-कभी यह एकल लॉग इन होता है। उस मशीन के लिए सिर्फ एक बार। इसे बाद में साफ करने की आवश्यकता है, पिछले कॉन्फ़िगरेशन को भी बहाल करना होगा।

जवाबों:


17

आप अस्थायी रूप से अपनी प्रतिलिपि बना सकते हैं .bashrc एक अन्य नाम के साथ अपने रिमोट मशीन के लिए। उदाहरण के लिए, उपयोग करना .bashrc_temp:

user@local$ scp .bashrc user@remote:~/.bashrc_temp

बाद में आप रिमोट मशीन में लॉग इन कर सकते हैं:

user@local$ ssh user@remote

तथा source फ़ाइल .bashrc_temp:

user@remote$ source ~/.bashrc_temp

अब आप अपने उपयोग में सक्षम हैं .bashrc और आपके कार्य। जब आप अपने काम के साथ समाप्त हो जाते हैं, तो आप दूरस्थ मशीन पर फ़ाइल ~ / .bashrc_temp को निकाल सकते हैं और लॉगआउट कर सकते हैं।

फ़ाइल की प्रतिलिपि और रिमोट मशीन से लॉगिन को एक बश फ़ंक्शन के साथ प्राप्त किया जा सकता है:

# copy the .bashrc to the remote machine 
# and log into the remote machine.
# parameter $1: user@remote
function s() {
  scp ~/.bashrc $1:~/.bashrc_temp
  ssh $1
}

अद्यतन करें :

आप कॉपी करने पर भी विचार कर सकते हैं .bashrc सेवा मेरे /tmp अपने दूरस्थ मशीन और स्रोत पर /tmp/.bashrc_temp

अपडेट २ :

आप रिमोट मशीन का उपयोग करके लॉग इन कर सकते हैं ssh -t । यह स्वचालित रूप से अपने अस्थायी का उपयोग करेगा .bashrc। अद्यतन समारोह s():

function s() {
  scp ~/.bashrc $1:/tmp/.bashrc_temp
  ssh -t $1 "bash --rcfile /tmp/.bashrc_temp ; rm /tmp/.bashrc_temp"
}

यह निश्चित रूप से मैं क्या देख रहा हूँ। धन्यवाद! लेकिन क्या इसे और अधिक कार्यात्मक करना संभव है? एक कदम में? क्योंकि अब हमें 3 चरणों की आवश्यकता है: लॉग इन करें, स्रोत, लॉगआउट से पहले हटाएं।

ठीक है, मैं आपके अपडेट के बाद अब देख रहा हूं। महान। एक और फिक्स: "bash --rcfile /tmp/.bashrc_temp; rm /tmp/.bashrc_temp"

मैंने अपने अपडेट में आपका फिक्स जोड़ दिया है 2. धन्यवाद।

5
लगभग सभी उत्तर (इस एक सहित) में पूर्वानुमेय फ़ाइल नाम का उपयोग करें /tmp/। किसी भी कोड को चलाने वाले उपयोगकर्ता के रूप में चलाने के लिए यह किसी अन्य उपयोगकर्ता द्वारा तुच्छ रूप से शोषण किया जा सकता है mktemp यह सुनिश्चित करने के लिए कि अस्थायी फ़ाइल में एक अद्वितीय नाम है।
Tometzky

9

jens-na ने एक उत्कृष्ट उत्तर प्रदान किया। मैंने थोड़ा समय बिताया और एक छोटे से बेहतर काम करने के लिए इसे फिर से काम किया। इस तरह, आप किसी भी पैरामीटर के साथ एसएसएच, जैसे पोर्ट नंबर, पास कर सकते हैं। अंतर यह है कि यह उपयोग करता है ssh अपलोड करने का आदेश .bashrc इसके बजाय फ़ाइल scp, जो विभिन्न कमांड पैरामीटर नामों का उपयोग करता है।

आप यह भी देखेंगे कि यह एक अलग फाइल अपलोड करता है, .bashrc_remote, ताकि आप सब कुछ के बजाय, जो आप दूरस्थ सर्वर पर स्रोत करना चाहते हैं, का चयन कर सकें

sshs() {
        ssh $@ "cat > /tmp/.bashrc_temp" < ~/.bashrc_remote
        ssh -t $@ "bash --rcfile /tmp/.bashrc_temp ; rm /tmp/.bashrc_temp"
}

इसे निम्नानुसार चलाएं:

sshs user@server

नाम ' sshs '' एसएसएच स्रोत '' के लिए है। उपयोग ssh जब आप स्रोत नहीं करना चाहते, और उपयोग करें sshs जब तुम करोगे।

https://gist.github.com/jonahbron/5549848


यह उपयोगी है। मापदंडों का एक ही सेट, अलग-अलग पोर्ट नं।
Tomek Wyderka

चूँकि यह एक ही कमांड नाम है, हो सकता है कि इसे एक रन में करना संभव हो, और केवल एक बार पासवर्ड टाइप करें ... दुर्भाग्य से एक के बाद एक आपके कमांड में शामिल हो रहा है: Pseudo-terminal will not be allocated because stdin is not a terminal
Tomek Wyderka

@TomekWyderka हाँ, मैंने इसे एक कमांड में लाने के लिए लगभग 20 मिनट तक कोशिश की, लेकिन रास्ता नहीं मिला। शायद मैं जितना समझ सकता था उससे कहीं ज्यादा BASH- प्रेमी था, लेकिन यह संभव प्रतीत नहीं होता।
Jonah

2
मैंने इसका उत्तर लिया है और कुछ हफ्तों में इस पर पुनरावृत्ति की है। परिणाम एक पूर्ण विकसित उपकरण है जो समस्या को कुचलता है: github.com/Russell91/sshrc
RussellStewart

1
@ जॉन आप मुझे समझा सकते हैं कि आपने $ @ के बजाय $ {*: 1} का उपयोग क्यों किया।
RussellStewart

7

मुझे लगता है कि sshrc वही है जो आप खोज रहे हैं: https://github.com/Russell91/sshrc

sshrc ssh की तरह ही काम करती है, लेकिन यह दूरस्थ रूप से लॉग इन करने के बाद भी ~ / .sshrc के स्रोतों का काम करती है।

$ echo "echo welcome" > ~/.sshrc
$ sshrc me@myserver
welcome

$ echo "alias ..='cd ..'" > ~/.sshrc
$ sshrc me@myserver
$ type ..
.. is aliased to `cd ..'

आप इसका उपयोग पर्यावरण चर सेट करने, फ़ंक्शंस निर्धारित करने और पोस्ट-लॉगिन कमांड चलाने के लिए कर सकते हैं। यह इतना आसान है, और यह सर्वर पर अन्य उपयोगकर्ताओं को प्रभावित नहीं करेगा - भले ही वे sshrc का उपयोग करें। अधिक उन्नत कॉन्फ़िगरेशन के लिए, पढ़ना जारी रखें।


अच्छा लगा। मुझे xxd हैक पसंद है!
Tomek Wyderka

@ टोमेक - हाँ xxd हैक पूरी तरह से भयानक है। मैंने वास्तव में scp के साथ काम करने की कोशिश की। फिर ssh में पाइपिंग के साथ। यह सिर्फ सर्वर पर 2 कॉल के बिना नहीं किया जा सकता है - 2 पासवर्ड प्रविष्टियां - 2 गोल यात्राएं यह अस्वीकार्य था। इसलिए मैंने अकल्पनीय किया।
RussellStewart

मेरे पास एक बग है। प्रतिक्रिया के बिना sshrc लटका रहता है। क्या आप कुछ डीबग कोड (टिप्पणियों में हो सकते हैं) को sshrc में डाल सकते हैं ताकि मैं इसे ट्रेस कर सकूं।
Tomek Wyderka

दिलचस्प। यह सिर्फ बैश स्क्रिप्ट है इसलिए आमतौर पर फेंकी गई कोई भी त्रुटि या चेतावनी स्वचालित रूप से स्क्रीन पर प्रिंट हो जाएगी। आपके .sshrc.d में कितने बाइट हैं? इसके अलावा, बस टाइप करें vim $(which sshrc) और आप बैश फ़ाइल देख सकते हैं। आप प्रत्येक पंक्ति के बाद इको कमांड जोड़कर देख सकते हैं कि वह कहां लटका हुआ है।
RussellStewart

5

सीमाओं के बारे में निश्चित नहीं है, लेकिन मैं इस तरह से काम करने में सक्षम था:

function ssh_with_rc() {
   RC_DATA=`cat ${HOME}/.bashrc | base64 -w 0`
   ssh -t $@ "echo \"${RC_DATA}\" | base64 --decode > /tmp/${USER}_bashrc; bash --rcfile /tmp/${USER}_bashrc; rm /tmp/${USER}_bashrc"
}

alias ssh="ssh_with_rc"

यह मेरे लिए सबसे अच्छा जवाब है क्योंकि यह एक एकल ssh कमांड है, कोई scp सामान नहीं है। मेरे लिए केवल शेष सुधार से बचने का रास्ता खोजना होगा RC_DATA चर।
Sridhar-Sarnobat

2

मैंने ये ढूंढ निकाला। यह आपको एक सामान्य आरसी फ़ाइल को बनाए रखने की अनुमति देता है, लेकिन सब कुछ एक एसएचएस कनेक्शन में भी करता है (यानी केवल एक स्केप करने के विपरीत एक बार लॉगिन करने की आवश्यकता होती है)।

#copies some environment over to the remote machine
function ssh() {
  /usr/bin/ssh -t $* "echo `base64 -i ~/bin/remote_ssh_env.sh` | base64 --decode > /tmp/remote_ssh_env.sh; bash --rcfile /tmp/remote_ssh_env.sh"
}

मुझे यकीन नहीं है कि आरसी फ़ाइल कितनी बड़ी हो सकती है, क्योंकि यह किसी बिंदु पर अधिकतम हो सकती है।


मुझे इस काम को सही करने के लिए एकल उद्धरणों में कमांड का हिस्सा लपेटना पड़ा। गूंज '`base64 .... sh`' - उसके बाद, यह खूबसूरती से काम किया। धन्यवाद!!
K Robinson

यदि आकार एक समस्या बन जाता है, तो आप बेस 64 एन्कोडिंग से पहले gzip जैसी संपीड़न उपयोगिता के माध्यम से फ़ाइल सामग्री को पाइप कर सकते हैं।
K Robinson

2

मुझे लगता है कि https://github.com/fsquillace/pearl-ssh आपको क्या चाहिए

मैंने इसे बहुत पहले sshrc के जन्म से पहले लिखा था और sshrc की तुलना में इसके और भी लाभ हैं:

  • इसे दोनों मेजबानों के लिए xxd पर निर्भरता की आवश्यकता नहीं है (जो दूरस्थ होस्ट पर अनुपलब्ध हो सकता है)
  • पर्ल-एसएचएस एक अधिक कुशल एन्कोडिंग एल्गोरिथ्म का उपयोग करता है
  • यह कोड की सिर्फ 20 पंक्तियाँ है (वास्तव में समझने में आसान है!)

उदाहरण के लिए:

$> echo "alias q=exit" > ~/.config/pearl/sshrc
$> ssh_pearl myuser@myserver.com
myserver.com $> q
exit

1

एक एकल एसएसएच सत्र के साथ इसे काम करने का एक विकल्प यह है कि आप अपनी बैश फ़ाइल को कॉपी करने के बजाय एक चर का उपयोग करें।

$ mybash=`cat mybash`
$ ssh -t 127.0.0.1 "echo $mybash > /tmp/mybash; bash --rcfile /tmp/mybash ; rm /tmp/mybash"

लगता है मेरे लिए काम करता है।


1

मैं तुम्हारी तरह एक समस्या को हल करने के लिए देख रहा था, और एहसास हुआ कि मैं वास्तव में क्या तलाश कर रहा था sshfs था। शायद आप भी इसका इस्तेमाल कर सकते हैं?

मेरी समस्या यह थी कि जब ssh'ing करते थे, तो मैं रिमोट काम करते समय अपने रंग, उपनाम, कार्य और स्क्रिप्ट रखना चाहता था।

http://fuse.sourceforge.net/sshfs.html


योग्य, यह मेरे लिए कभी नहीं हुआ। यह काफी रचनात्मक समाधान है।
Sridhar-Sarnobat
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.