मैं यह कैसे पता लगा सकता हूं कि शेल को एसएसएच से नियंत्रित किया गया है?


69

अगर यह SSH के माध्यम से नियंत्रित किया जाता है, तो मैं एक शेल स्क्रिप्ट (विशेष रूप से .zshrc) से पता लगाना चाहता हूं। मैंने HOST चर की कोशिश की, लेकिन यह हमेशा कंप्यूटर का नाम है जो शेल चला रहा है। क्या मैं होस्टनाम का उपयोग कर सकता हूं जहां एसएसएच सत्र आ रहा है? दोनों की तुलना करने से मेरी समस्या दूर हो जाएगी।

हर बार जब मैं लॉग इन करता हूं तो अंतिम लॉगिन समय और होस्ट बताते हुए एक संदेश होता है:

Last login: Fri Mar 18 23:07:28 CET 2011 from max on pts/1
Last login: Fri Mar 18 23:11:56 2011 from max

इसका मतलब है सर्वर में यह जानकारी है।

जवाबों:


90

यहां मेरे द्वारा उपयोग किए जाने वाले मानदंड हैं ~/.profile:

  • यदि कोई एक चर SSH_CLIENTया SSH_TTYपरिभाषित है, तो यह एक ssh सत्र है।
  • यदि लॉगिन शेल की मूल प्रक्रिया का नाम है sshd, तो यह एक ssh सत्र है।
if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ]; then
  SESSION_TYPE=remote/ssh
# many other tests omitted
else
  case $(ps -o comm= -p $PPID) in
    sshd|*/sshd) SESSION_TYPE=remote/ssh;;
  esac
fi

(आप अपने सत्र स्टार्टअप के बजाय अपने शेल कॉन्फ़िगरेशन में इसका परीक्षण क्यों करना चाहेंगे?)


3
बढ़िया काम किया धन्यवाद! github.com/balupton/dotfiles/commit/…
balupton

1
यदि आप अपने दूरस्थ शेल से आगे ssh एजेंट को सक्षम करना चाहते हैं, तो आप अपने शेल कॉन्फ़िगरेशन में ऐसा करना चाह सकते हैं (क्योंकि प्रत्येक संस्करण में आप जिस परिवेश से सेट करना चाहते हैं) जब तक मैं कुछ याद नहीं कर रहा हूँ?
16:14

@underrun मुझे आपकी बात समझ नहीं आई। यदि आप एक ही सत्र में एक और शेल चलाते हैं, तो यह पर्यावरण के चर को निर्धारित करता है .profile। और एजेंट अग्रेषण के साथ इसका क्या करना है?
गाइल्स

1
@underrun यदि आप SSH एजेंट की उपस्थिति के लिए परीक्षण करना चाहते हैं, तो SSH_AUTH_SOCKचर के लिए परीक्षण करें । लेकिन आप उस मामले में एसएसएच एजेंट को क्यों चलाएंगे? क्या आपका मतलब एजेंट शुरू करना है अगर आप बिना एजेंट अग्रेषण के लॉग इन हैं? अगर पहले से ही एक ( [ -n "$SSH_AUTH_SOCK" ] || eval $(ssh-agent)) नहीं है तो एजेंट शुरू क्यों नहीं करें ?
गाइल्स

1
@Praxeolitic SSH_*चर भी एक शेल के उपप्रोसेस में सेट होते हैं, जो SSH सत्र के प्रमुख पर होता है, उदाहरण के लिए यदि आप SSH पर एक स्क्रीन सत्र शुरू करते हैं (यदि आप देखभाल करते हैं तो सत्र शुरू करने से पहले वेरिएबल्स को अनसुना कर देना चाहिए)। मुझे लगता है कि मूल प्रक्रिया का परीक्षण करने का कारण यह है कि मैंने ऐसा करना शुरू कर दिया है, इससे पहले कि एसडीएस किसी भी पर्यावरण चर को परिभाषित करता है।
गाइल्स

21

आप के माध्यम से जांच करने के लिए सक्षम होना चाहिए SSH_TTY, SSH_CONNECTIONया SSH_CLIENTचर।


1
इसके अलावा इन में जोड़ने env_keepमें sudoersयह भर में काम करने के लिए suआदेशों :)
थॉमस जी

10

मुझे बस बश का उपयोग करते हुए लिनक्स में एक ही समस्या थी। मैंने पहले पर्यावरण चर SSH_CONNECTION का उपयोग किया, लेकिन फिर महसूस किया कि यह सेट नहीं है यदि आप su -

ऊपर दिए गए अंतिम समाधान ने suया तो काम नहीं किया su -

अंत में, मैं उपयोग कर रहा हूं who am i, जो एसएसएच कनेक्शन होने पर अंत में रिमोट आईपी (या होस्टनाम) दिखाता है। यह सु के बाद भी काम करता है।

बैश नियमित अभिव्यक्ति का उपयोग करते हुए, यह काम करता है:

if [[ $(who am i) =~ \([-a-zA-Z0-9\.]+\)$ ]] ; then echo SSH; else echo no; fi

यदि zsh नियमित अभिव्यक्तियों का समर्थन नहीं करता है, तो उसी को कई अलग-अलग तरीकों से प्राप्त किया जा सकता है grep, cut, sed, या जो भी हो।

जिज्ञासु के लिए, नीचे मैं इसके लिए उपयोग करता हूं, रूट के .bashrc में:

    # We don't allow root login over ssh.
    # To enable root X forwarding if we are logged in over SSH, 
    # use the .Xauthority file of the user who did su

    w=$(who am i)
    if [[ $w =~ \([-a-zA-Z0-9\.]+\)$ ]] ; then
        olduser=${w/ .*/}
        oldhome=$(getent passwd $olduser | cut -d: -f 6)
        [ -f "$oldhome/.Xauthority" ] \
          && export XAUTHORITY=$oldhome/.Xauthority
    fi

एक वैकल्पिक विकल्प जो मूल प्रक्रियाओं के माध्यम suसे पुन: खोज करने के लिए काम करेगा sshd:

#!/bin/bash

function is_ssh() {
  p=${1:-$PPID}
  read pid name x ppid y < <( cat /proc/$p/stat )
  # or: read pid name ppid < <(ps -o pid= -o comm= -o ppid= -p $p) 
  [[ "$name" =~ sshd ]] && { echo "Is SSH : $pid $name"; return 0; }
  [ "$ppid" -le 1 ]     && { echo "Adam is $pid $name";  return 1; }
  is_ssh $ppid
}

is_ssh $PPID
exit $?

यदि फ़ंक्शन को .bashrc में जोड़ा जाता है, तो इसका उपयोग किया जा सकता है if is_ssh; then ...


1
दूरस्थ tmuxसत्रों में काम नहीं करता है और अगर IPv6 के माध्यम से लॉग इन किया है और कोई DNS रिवर्स नाम मौजूद नहीं है, तो भी समस्याएँ हैं।
लाभ

@ बीन: क्या काम नहीं करता है? नियमित अभिव्यक्ति, या who am iअपना IPv6 पता नहीं दिखाती है?
19

1) who am iएक दूरस्थ tmuxसत्र में कुछ भी वापस नहीं करता है । 2) IPv6 पते में कॉलोन हो सकते हैं जो आपके रेगेक्स की अनुमति नहीं देता है। यह मुश्किल हो सकता है क्योंकि मेरे लिए एक्स सत्र में who am iशामिल (:0.0)है (xterm)।
लाभ

@ बीन: वैकल्पिक समाधान जो मैंने अभी जोड़ा है वह भी आईपीवी 6 के साथ काम करना चाहिए। मैं tmux के बारे में नहीं जानता, लेकिन यह भी काम करता है screen
mivk

7

मुझे लगता है कि गिल्स और कैकेमोक्स के उत्तर अच्छे हैं, लेकिन सिर्फ पूर्णता के लिए ...

Last login: Fri Mar 18 23:07:28 CET 2011 from max on pts/1

pam_lastlog1 से आता है ।

आप 2 कमांड pam_lastlogका उपयोग करके जानकारी प्रिंट कर सकते हैं , जैसेlastlog

$ lastlog -u mikel  
Username         Port     From             Latest
mikel            tty1                      Fri Jan 28 10:58:10 +1100 2011

की तुलना में एक स्थानीय लॉगिन के लिए

Username         Port     From             Latest
mikel            pts/9    mikel-laptop     Sat Mar 19 11:11:58 +1100 2011

SSH लॉगिन के लिए।

मेरे सिस्टम पर, यह इसे निकालने के लिए काम करता है

$ lastlog -u mikel | sed -ne '2{p;q}' | cut -c 27-42
mikel-laptop 

lastऔर wउदाहरण के लिए भी उपयोगी हो सकता है

$ TTY=$(tty)
$ last -n 1 ${TTY#/dev/} | sed -ne '1{p;q}'
mikel    pts/12       :0.0             Sat Mar 19 11:29   still logged in 


1 लिनक्स / फ्रीबीएसडी प्रलेखन pam_lastlog
2 लिनक्स / फ्रीबीएसडी lastlog(8) मैन पेज।


1

अपने पर्यावरण पर एक नज़र डालने और सही विकल्प खोजने के द्वारा शुरू करें

printenv|grep SSH
SSH_CLIENT=192.168.1.xxx
SSH_CONNECTION=192.168.1.xxx
SSH_TTY=/dev/ttys021

आप उनकी उपस्थिति के आधार पर विशिष्ट कार्यों को ट्रिगर करने के लिए इनमें से कई पर्यावरण चर में हुक कर सकते हैं।


-1

यह एसएसएच का उपयोग करके अन्य उपयोगकर्ता से सभी स्थापित कनेक्शन की जांच करना है

netstat | grep ssh

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