Ssh लॉगिन करने के बाद एक फाइल को प्रॉम्प्ट के लिए ड्रॉप करें

Aug 16 2020

एक-लाइनर प्रश्न: मैं एसएसएच के माध्यम से एक गढ़ होस्ट के माध्यम से लॉग इन करने के बाद दूरस्थ होस्ट पर दूरस्थ फ़ाइल को स्वचालित रूप से कैसे दर्ज करूं?

मुझे एक फाइल रखने की आवश्यकता है जिसमें उपनाम + शेल उपयोगकर्ता परिभाषित कार्यों की सूची हो, जो ssh-ing के बाद एक दूरस्थ होस्ट पर कार्य करता है।

फ़ाइल दूरस्थ मेकिंग में / tmp फ़ोल्डर जैसे / tmp / my-rc पर मौजूद है

अन्य पोस्ट और इंटरनेट की खोज मैंने पाया है

ssh -t [email protected] 'source /tmp/my-rc; bash -l'

समस्या यह है कि मुझे एक टर्मिनल मिलता है, लेकिन कोई भी अलाइंस सेट नहीं है क्योंकि यह एक नया बैश शेल है '

यह सोचकर कि शेल संलग्न होने के बाद स्रोत किया जाना चाहिए, नीचे की कोशिश की गई लेकिन यह भी काम नहीं करता है। कोई त्रुटि नहीं है, मुझे टर्मिनल मिला है, लेकिन यह मत सोचो कि फाइल खट्टी हो गई है (/ tmp / my-rc फाइल से डमी संदेश गूंज कर सत्यापित)

ssh -t [email protected] 'bash -l; source /tmp/my-rc'

यहां तक ​​कि 'के साथ' की कोशिश की। स्रोत के बजाय, कोई भाग्य नहीं।

कोई मदद।

Note1: बैश या ZSH किसी भी शेल समाधान करना होगा।

नोट 2: एक्टुएल एसएचएस एक प्रॉक्सी कमांड के माध्यम से है, जो कि गढ़ होस्ट पर एक हॉप है (बस इसका उल्लेख है कि यह उस पर निर्भर है)

Note3: मेरे पास एक प्रोफ़ाइल rc या bashrc या दूरस्थ होस्ट पर एक होम डायरेक्टरी का भी निजीकरण नहीं है।

नोट 4: जिस सटीक कमांड को मैंने सुरक्षित होस्ट में लॉगिन करने के लिए इस्तेमाल किया था, वह नीचे दिए गए गढ़ के माध्यम से है

ssh -o ProxyCommand='ssh -W %h:%p ec2-3-218-12-120.compute-1.amazonaws.com' 10.0.31.122  

जवाब

4 StéphaneChazelas Sep 01 2020 at 23:09

के साथ bash, आप कर सकते हैं:

ssh -t user@host '
  PROMPT_COMMAND="source /tmp/my-rc
                  unset PROMPT_COMMAND
                 " exec bash --norc'

जिसके कारण /tmp/my-rcसंकेत से पहले ही खटास पैदा हो जाएगी, और केवल उस संकेत के बाद से हम परेशान हैं PROMPT_COMMAND

आप इसे वास्तव में परिभाषित करते हुए समाप्त करना चाहते हैं unset PROMPT_COMMANDतो निकालना चाहते हैं /tmp/my-rc

उपर्युक्त दूरस्थ उपयोगकर्ता के लॉगिन शेल का बॉर्न जैसा है, लेकिन आपको इसे अन्य प्रकार के गोले (csh / rc / fish) के अनुकूल बनाना चाहिए।

2 fra-san Sep 01 2020 at 22:30

यह देखते हुए कि आप दूरस्थ होस्ट के लिए लिख /tmpसकते हैं, आप /tmp/myhomeउस पर एक निर्देशिका बना सकते हैं , अपने गोले की प्रोफाइल और आरंभिक फ़ाइलों को वहां रख सकते हैं और फिर ZDOTIDRसेट के साथ Zash /tmp/myhomeऔर HOMEसेट के साथ बैश शुरू कर सकते हैं /tmp/myhome

डिफ़ॉल्ट रूप से, Zsh सेट नहीं है $ZDOTDIR, $HOMEतो डिफ़ॉल्ट रूप से अपनी आरंभिक फ़ाइलों की खोज करता है ZDOTDIR

इसलिए, आप दूरस्थ मेजबान पर Zsh शुरू कर सकते हैं:

ssh -t user@host ZDOTDIR=/tmp/myhome zsh

और बैश के रूप में:

ssh -t user@host HOME=/tmp/myhome bash

बेशक आप अपनी प्रोफ़ाइल / आरंभीकरण फ़ाइलों के साथ रचनात्मक हो सकते हैं - जैसे कि उनका उपयोग HOMEअधिक उपयुक्त पथ, स्रोत की अन्य फ़ाइलों (यदि आपके पास पहले से ही दूरस्थ होस्ट पर कहीं-कहीं डॉट-फ़ाइलें हुआ है) आदि के लिए सेट करने के लिए करें।

इस दृष्टिकोण का एक न्यूनतम अनुप्रयोग, एक कमांड में संघनित हो सकता है:

ssh -t user@host 'mkdir /tmp/myhome
  echo ". /tmp/my-rc" >/tmp/myhome/.bashrc
  HOME=/tmp/myhome bash'

( पहले से मौजूद mkdir -p ...होने पर दिखाई देने वाली किसी त्रुटि को रोकने के लिए उपयोग करें /tmp/myhome, जैसे कि यदि आप दूरस्थ होस्ट से पुन: कनेक्ट हो रहे हैं और आपको पहले से ही पता है कि निर्देशिका मौजूद है)।

अपने ProxyCommandखाते में लेना , यह हो सकता है:

ssh -t -o ProxyCommand='ssh -W \
  %h:%p ec2-3-218-12-120.compute-1.amazonaws.com' \
  10.0.31.122 \
  'mkdir /tmp/myhome
  echo ". /tmp/my-rc" >/tmp/myhome/.bashrc
  HOME=/tmp/myhome bash'

अंत में, आपके प्रयासों के बारे में: ssh -t [email protected] 'bash -l; source /tmp/my-rc'काम नहीं कर रहा है क्योंकि sourceकमांड केवल इंटरैक्टिव शेल से बाहर निकलने के बाद निष्पादित होता है।

1 jakethefinn Sep 04 2020 at 19:40

यदि UsePAM को दूरस्थ होस्ट की sshd_config फ़ाइल में हां करने के लिए सेट किया गया है , तो फ़ाइल /etc/pam.d/sshd को कॉन्फ़िगर करें आपको प्रमाणीकरण प्रक्रिया में अन्य घटनाओं के बीच सफल लॉगिन पर कमांड निष्पादन को स्वचालित करने की अनुमति देता है। इस कोड की लाइन जोड़ें

session    required     pam_exec.so /etc/myscripts/./sourcing-script

सीधे इन लाइनों के ऊपर

# SELinux needs to intervene at login time to ensure that the process starts
# in the proper default security context.  Only sessions which are intended
# to run in the user's context should be run after this.
session [success=ok ignore=ignore module_unknown=ignore default=bad]        pam_selinux.so open

जहां / आदि / myscripts / सोर्सिंग-स्क्रिप्ट बस सफल लॉगिन पर निष्पादित करने के लिए कमांड के साथ रिमोट होस्ट पर एक फ़ाइल है।

#!/bin/bash
source /tmp/my-rc
#echo $(date) >> /etc/myscripts/sourcing-script.log
#cat /tmp/my-rc >> /etc/myscripts/sourcing-script.log

मैं इस विधि का उपयोग किसी सेवा को रोकने और लॉग फ़ाइल में रिपोर्ट करने के लिए करता हूं, इससे पहले कि मेरा ssh सत्र खोला जाए। इससे पहले कि मैं लॉग आउट करता हूं मैंने सेवा शुरू करने के लिए एक क्रेस्टैब सेट किया है, इसलिए यह मेरे ssh सत्र के समानांतर कभी नहीं चलता है।

dirkt Aug 16 2020 at 13:40

आमतौर पर आप ऐसा $HOME/.profileया वेरिएंट में करते हैं।

sshवातावरण चर सेट करना शुरू कर देता है SSH_, आप यह निर्धारित करने के लिए उपयोग कर सकते हैं कि आपने लॉग इन किया है sshया सीधे।