मूल मशीन का आईपी या होस्टनाम ढूँढना


10

मैं विभिन्न भौतिक स्थानों (और इस प्रकार विभिन्न भौतिक मशीनों) से लगातार कई मशीनों से जुड़ता हूं। इसमें से अधिकांश से किया जाता है, हालांकि ssh, कभी कभी एक प्रवेश द्वार मशीन या दो की आवश्यकता है (जो मैं आह्वान के माध्यम से ProxyCommandमें ~/.ssh/config)। मैं यह जानना चाहता हूं कि क्या रिमोट कनेक्शन पर प्रारंभिक कनेक्शन (यानी मैं जिस मशीन पर काम कर रहा हूं) को कॉल करने वाली मशीन के आईपी या होस्टनाम की पहचान करने की कोई विधि है?

  • मैं पर्यावरण चर नहीं भेजना चाहता क्योंकि कुछ मशीनों में मुझे सेट करने के लिए रूट नहीं है PermitUserEnvironment
  • $SSH_CLIENTवातावरण चर सीधे कनेक्शन के लिए उपयोगी है, लेकिन केवल सबसे हाल ही में प्रवेश द्वार सूचीबद्ध करता है।

एक समाधान के लिए मेरा वर्तमान विचार $SSH_CLIENTयह है कि इसे हड़पने के लिए , उस मशीन के $SSH_CLIENTमूल्य को ढूंढें और तब तक दोहराएं जब तक यह मौजूद न हो; फिर hostname को पकड़ो और इसे किसी भी तरह वापस खींचें।

हालांकि एक हैक काम का एक सा लगता है; किसी को भी एक बेहतर तरीका है?

मैं ज्यादातर बैश शेल में काम कर रहा हूं, लेकिन मैं ऐसे किसी भी सुझाव के लिए खुश हूं जो इसका उपयोग नहीं करता है।


ProxyCommand के उद्देश्यों में से एक मूल मेजबान को छिपाने (या भूलने के बारे में) है (जो उदाहरण के लिए वैसे भी अंतिम मेजबान से नियमित नहीं हो सकता है)
Hagen von Eitzen

क्या आप एक उदाहरण दे सकते हैं कि आपको यह जानकारी कहाँ या क्यों चाहिए? अन्य गैर-स्पष्ट समाधान हो सकते हैं।
मानवी

@ मैनवे मैं अंततः अपने .bashrc जैसी चीजों में स्थानीय विशिष्ट वर्गों को स्थापित करना चाहता हूं। अभी मुझे बस इतना करना है कि मैं किस मशीन से काम कर रहा हूं, उसके आधार पर स्वचालित रूप से तीन कीबोर्ड लेआउट में से एक सेट कर दिया जाता है।
जियोडेसिक

जवाबों:


3

मैंने कभी कोशिश नहीं की है, लेकिन मैं कुछ सोच सकता हूं जो काम कर सकता है: आप एसएसएच को अपना लॉगिन शेल शुरू नहीं करने देंगे, लेकिन मामलों को अपने हाथों में लें। आप SSH को मनमानी कमांड चलाने के लिए कह सकते हैं। के बजाय

ssh remote_host

आप की तर्ज पर कुछ चलेंगे

ssh remote_host -t "
    . /etc/profile; 
    . /etc/bash.bashrc; 
    DAT_ORIGIN_HOST=$(ifconfig eth0|grep -Po 't addr:\K[\d.]+') /bin/bash -l -i"

यह क्या करता है, यह लॉगिन शेल लॉन्च करने के बजाय एसएसएच को कुछ और करने के लिए देता है। कि कुछ एक स्ट्रिंग है, जिसे दूरस्थ रूप से कमांड के रूप में चलाया जाएगा। हम एक विशेष तरीके से एक शेल लॉन्च करने के लिए इसका उपयोग करते हैं: हम इसे एक पर्यावरण चर देते हैं DAT_ORIGIN_HOST, जिसमें eth0 पर हमारा आईपी शामिल है (आपको इसे बदलने की आवश्यकता हो सकती है)।

हम जो चाल करते हैं वह यह है कि हम दूरस्थ रूप से दोहरे क़ाउट में निष्पादित करने के लिए कमांड डालते हैं "। दोहरे उद्धरण (कम से कम बाश में) का अर्थ है, जो पहले से एसएसएच के लिए तैयार है, हमारा शेल इसे स्कैन करता है और जहां उपयुक्त हो, विस्तार / प्रतिस्थापन करता है। इसका मतलब है कि हमारा शेल हमारे मौजूदा आईपी पते के लिए `$ (ifconfig ...) भाग का मूल्यांकन करेगा, और एक स्ट्रिंग ssh पास करेगा जिसमें हमारे स्थानीय आईपी पते के साथ एक पर्यावरण चर के लिए परिभाषा है।

एक बार रिमोट मशीन में लॉग इन करने के बाद, echo $DAT_ORIGIN_HOSTअपना आईपी पता प्रिंट करना चाहिए।

SSH के लिए उस कॉल को विकसित करने के लिए मैं बेशर्मी से आईपी ​​एड्रेस निकालने के लिए यहाँ से ले आया और यहाँ -t के लिए और कैसे इंटरएक्टिव लॉन्च करने के लिए

अस्वीकरण: मैं इसके बारे में -lऔर -iविकल्प के बारे में अनिश्चित हूं /bin/bash। शायद आपको उन्हें छोड़ना होगा।


आप यहाँ कुछ करने के लिए हो सकता है! मैं इसके लिए थोड़ा साथ खेलूंगा और आपके पास वापस आऊंगा।
जियोडेसिक

मैं इस जवाब को चिह्नित कर रहा हूं, क्योंकि छद्म ट्टी और रिमोट कमांड दोनों काम करते हैं। मैंने अंततः अपने विशेष मामले को ^ ई कॉलबैक के साथ हल किया, जो रिमोट कमांड के सुझाव पर आधारित है - यह थोड़ा साफ और सामान्य उपयोग होने पर समाप्त होता है। धन्यवाद!
जियोडेसिक

2

आईडी मुझे सही ढंग से समझ में आया कि आप सीधे मूल मशीन से proxycommandहॉप्स के साथ गंतव्य के लिए कनेक्शन हैं । और इसलिए यहां आपके लिए तीन हैक हैं (उपयोग परिदृश्य पर टिप्पणी के बाद तीसरा जोड़ा गया)। पहले) आप के साथ मूल मशीन को वापस लाने के लिए अनुमति देने के लिए दूरस्थ पोर्ट अग्रेषण का उपयोग करें-R remotemachineport:dstonlocalnet:dstportonlocalnet

ssh -R 2222:localhost:22 user@target
# on "target" you can now do this to get back to origin host
ssh user2@localhost -p 2222 

दूसरा) AcceptEnv LC_*लक्ष्य पर दुर्व्यवहार । यह अच्छा नहीं है, लेकिन LOCALE वैरिएबल को भी अनुमति देने के लिए यह काफी सामान्य है, यहां तक ​​कि AcceptUserEnviconment भी उपलब्ध नहीं है। तो अब आप कर सकते हैं:

export LC_SOURCEHOST=my.ip.addr.or:something
ssh user@target
# on tathet:
echo $LC_SOURCEHOST

तीसरा) मेजबान या मेजबान प्रकार की पहचान करने के लिए आगे ssh रिमोट का उपयोग करें।

# Here is an example what you can use on target machine. 
# This will modify your PS1 variable (prompt) based on source host (port forwarding)
# Add this to .bash_profile

function checkHost {
  RET=""
  ## loop over test port numbers 17891-17895 in my example
  for x in $(seq 1 5); do 
    # if netstat is not available test port some other way like with nc or something
    ## && RET= will set RET = 1-5
    /bin/netstat -lnt|/bin/grep -q 127.0.0.1:1789$x && RET=$x;
  done
  # return RET
  # please note that if you have multiple open connections with different port numbers
  # this method cannot not distinguish between them 
  echo $RET
}

# get 1-5 number from function above
VAL=$(checkHost)
# do something like set PS1 var or map vim file or something
export PS1='\[\033k\033\\\]\u@\h: \w\$ '$VAL

अब पोर्ट फ़ॉरवर्डिंग से कनेक्ट करें:

### this will still enable ssh forwarding back. Change 22 to something else like 
### 24 to disable it (if nothing is listening on your source machines 24 port)
ssh -R 17891:localhost:22 user@target

सुझावों के लिए धन्यवाद, लेकिन न तो अभी तक मेरी पूर्ण संतुष्टि के लिए काम करते हैं। रिमोट पोर्ट फॉरवर्ड एक बुरा विचार नहीं है, लेकिन एक आवश्यक धारणा यह है कि आपके पास सभी होस्ट पर एक ही उपयोगकर्ता नाम है। यहाँ ऐसा नहीं है और न ही मैं कुछ बदल सकता हूँ। दूसरा: मुझे यह काम नहीं मिला। आप कह रहे हैं कि AcceptEnv LC_*है आम तौर पर डिफ़ॉल्ट सेटिंग द्वारा अनुमति दी है, लेकिन नहीं एक मानक, पर?
जियोडेसिक

खैर LC_ हिट और मिस है। मैं इस बात पर टिप्पणी नहीं कर सकता कि यह कितना प्रचलित है, लेकिन यह कुछ ऐसा है जो काम कर सकता है .. (ssh कनेक्शन से पहले LC_SOURCEHOST निर्यात करना याद रखें)।
मानवे

LC_ * का परीक्षण किया और यह काम करता है। यह AcceptEnvनिर्देश में सूचीबद्ध कोई भी चर हो सकता है /etc/ssh/sshd_configsshdयदि यह फ़ाइल बदल जाती है तो पुनः आरंभ करना याद रखें ।
david.perez

1

आप who -mवर्तमान में लॉग इन उपयोगकर्ता (होस्टनाम सहित) पर जानकारी प्राप्त करने के लिए दूरस्थ छोर पर टाइप कर सकते हैं । whoआपको लॉग इन उपयोगकर्ताओं के बारे में जानकारी देता है, और -mस्विच आपको "केवल होस्टनाम और उपयोगकर्ता के साथ जुड़ा हुआ है" दिखाता है।


यह तभी उपयोगी है जब मैं गेटवे मशीन के माध्यम से सुरंग नहीं बना रहा हूँ।
जियोडेसिक

0

क्या आपने निम्नलिखित कोशिश की?

 netstat -an | grep " 22 "

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