यदि मैं SSH के माध्यम से लॉग इन हूं तो यह कैसे निर्धारित करें?


17

मैं वर्तमान में काफी जटिल बैश विन्यास स्थापित कर रहा हूं जिसका उपयोग कई मशीनों पर किया जाएगा। मैं यह पता लगाने की कोशिश करता हूं कि क्या यह निर्धारित करना संभव है कि मैं एसएसएच या स्थानीय मशीन पर लॉग इन हूं। इस तरह, मैं इस तथ्य के आधार पर कुछ उपनाम सेट कर सकता था। एक दूरस्थ सर्वर को रोकने के haltलिए एलियासिंग की तरह restartयह सबसे अच्छी बात नहीं हो सकती है।

अब तक मुझे जो भी पता है, वह यह है कि SSH_CLIENTजब मैं ssh से लॉग इन करता हूं , तो वातावरण चर सेट होता है। दुर्भाग्यवश, जब मैं एक सुपर उपयोगकर्ता शेल के साथ शुरू करता हूं तो इस चर को छोड़ दिया जाता है sudo -s। मुझे यह भी पता है कि मैं सूडो को एक पैरामीटर पास कर सकता हूं जो सूडो को निर्देश देता है कि वह अपने सभी पर्यावरण चर को नए शेल वातावरण में कॉपी कर सकता है, लेकिन अगर मैं ऐसा नहीं करना चाहता हूं, तो क्या कोई दूसरा तरीका है?

जवाबों:


14

आप "w" या "who" कमांड आउटपुट का उपयोग कर सकते हैं। जब आप ssh से जुड़ते हैं, तो वे आपके स्रोत को IP दिखाएंगे।


1
शिक्षित अनुमान लगाओ। उदाहरण के लिए, रन ps afxऔर TTY शेल नहीं चलने के psलिए अन्य लॉगिन होगा।
वार्नर

6
का उपयोग करें who am i
पॉल टॉमब्लिन

1
"uname -n" आपको होस्टनाम देगा
ह्यूबर्ट करियो

1
प्रश्न इसे निकालने से अधिक संबंधित प्रतीत होता है who am i, ताकि आप यह निर्धारित कर सकें कि आप SSHing कर रहे हैं या नहीं। यह काम करता है:hostname=$(who am i | cut -f2 -d\( | cut -f1 -d:)
blueyed

4
@PaulTomblin वास्तव में, आप whoकिसी भी दो अतिरिक्त तर्कों के साथ उपयोग कर सकते हैं । who am iएक ही रूप में है who is meया who is awesomeया who potato potato। एक तथ्य मुझे थोड़ा दिलचस्प लगा।
किरकपट्ट 20

9

यहाँ एक बेहतरीन जवाब है जो मुझे unix.stackexchange पर मिला है :


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

सुडो-एस के लिए काम नहीं करता है
मैट


4

यदि आप यह जानना चाहते हैं कि क्या आप खोल को काटते हैं तो आप सीधे sshd की बाल प्रक्रिया है (n> 1 परत गहरी नहीं)

cat / proc / $ PPID / स्थिति | सिर -1 | कट -२

यह आपको sshdया आपके वर्तमान शेल के मूल प्रक्रिया का नाम देना चाहिए ।


सुडो-एस के लिए काम नहीं करता है
मैट

ps -o cmd= $PPIDयाawk '/^Name:/ {print $2}' /proc/$PPID/status
छह

3

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


3

हां, जैसा कि अन्य ने नोट किया है, यह जानकारी आउटपुट में आपके आईपी में कोष्ठक में मौजूद है who am i

आप इसका पता लगाने के लिए बैश नियमित अभिव्यक्ति का उपयोग कर सकते हैं:

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

1
यह एक होस्टनाम भी हो सकता है।
blueyed

होस्टनाम में संख्याएँ होती हैं तो काम नहीं करता है।
योयोयोनी

1

मैं निम्नलिखित के साथ आया हूं, यहां दूसरों के सुझावों के आधार पर।

यह कैशिंग के लिए एक चर का उपयोग करता है - मैं इसे अपने शेल थीम में उपयोग कर रहा हूं।

is_ssh() {
    (( $+SSH_CLIENT )) && return
    if ! (( $+_ZSH_IS_SSH )); then
        # "who am i" displays current user from utmp(5).  This will be empty for
        # a "normal" terminal.  With Konsole, it is ":0" for display :0,
        # for ssh it is the hostname and with tmux sth like "tmux(PID).ID".
        local whoami="$(who am i)"}
        local host="${whoami#*\(*}"
        [[ -n $host && $host != tmux* && $host != :* ]]
        _ZSH_IS_SSH=$?
    fi
    return $_ZSH_IS_SSH
}

स्रोत: is_sshमें https://github.com/blueyed/oh-my-zsh/blob/master/themes/blueyed.zsh-theme#L51-63


0

अपने शेल के मूल cmdline और पुनर्खरीद के लिए देखें। शायद निम्नलिखित की तरह कुछ:

#!/usr/bin/env bash

## Find out how I'm logged in
# Tested on RHEL5.5

PD=${1:-$$}
ME=`basename $0`

## Read the shell's PPID
PAR=`ps --no-headers -p $PD -o ppid`

## CMDLINE can contain stuff like the following:
# /sbin/getty-838400tty4 // logged in at a console
# gnome-terminal         // logged in Gnome Terminal
# -bash                  // in a subshell
# su-                    // we became another user using su
# sshd: jc@pts/1         // logged in over ssh
# login                  // logged in terminal or serial device

eval `python - << __EOF__
import re
f = open("/proc/${PAR}/cmdline", 'r')
ln = f.readline()
if re.search(r'^ssh', ln): 
    print "echo Logged in via ssh"
if re.search(r'getty.*?tty', ln):
    print "echo Logged in console"
if re.search("gnome-terminal", ln):
    print "echo Logged in Gnome"
if re.search(r'^login', ln):
    print "echo Logged in console"
if re.search(r'^-?bash', ln) or re.search(r'^su', ln): 
    print "./$ME $PAR"
f.close()
__EOF__
`

यह वास्तव में काम करने के लिए संपादित :)


0

यदि आप लॉगिन के पहले स्तर पर हैं, तो अन्य सभी उत्तर काम करते हैं। लेकिन अगर, एक बार लॉगिन करते हैं, तो आप 'सु' या 'सूडो' चलाते हैं (मेरे मामले में, सुरक्षा कारणों से बिना शेल के उपयोगकर्ता खाते में जाने के लिए, मुझे दौड़ना होगा: सूडो सु - <userid> -s / bin / bash - एल) , उनका समाधान विफल हो जाता है।

निम्नलिखित एक सार्वभौमिक समाधान है; pstree का उपयोग करते हुए, आप माता-पिता के रूप में sshd की जांच करते हैं।

if pstree -p | egrep --quiet --extended-regexp ".*sshd.*\($$\)"; then
  echo "I am remote."
else
  echo "I am local."
fi

यहाँ egrep का आउटपुट है, जब --quiet हटा दिया जाता है। यह पूरे पदानुक्रम को दिखाता है जो दूर से जुड़ा होने पर मेल खाता है।

   |            |-sshd(18599)---sshd(18603)---bash(18604)---sudo(18823)---bash(18824)-+-egrep(22417)

0

कृपया ध्यान रखें कि इस सवाल का जवाब बहुत है, बहुत लिनक्स विशिष्ट।

parent_pid=$$
while [[ -z "${tty_bits-}" || $tty_bits -ne 0 ]]; do
  read initiator_name parent_pid tty_bits < <(
    awk '{ print substr($2, 2, length($2) - 2) " " $4 " " $7 }' /proc/$parent_pid/stat
  )
done

echo $initiator_name

यह एक महत्वपूर्ण धारणा बनाता है: लॉगिन प्रक्रिया में एक नियंत्रित TTY नहीं होगा; आप शायद यह जांचना चाहते हैं कि क्या आपके पास इस कोड को चलाने से पहले एक नियंत्रित TTY है (जो, आपकी आवश्यकताओं के आधार पर, शायद एक सुरक्षित शर्त है, वैसे भी)।

कोड प्रक्रिया ट्री के माध्यम से ऊपर की ओर पुनरावृत्ति करता है, जब तक कि यह उस प्रक्रिया को नहीं ढूंढता है जिसका कोई नियंत्रण TTY नहीं है। $initiator_nameइस प्रक्रिया का नाम होगा ("sshd", उदाहरण के लिए)।

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