SSH सत्र में क्लाइंट का IP पता खोजें


166

मेरे पास एक स्क्रिप्ट है जिसे उस व्यक्ति द्वारा चलाया जाना है जो एसएसएच के साथ सर्वर में लॉग इन करता है ।

क्या यह पता लगाने का एक तरीका है कि उपयोगकर्ता किस आईपी पते से जुड़ रहा है?

बेशक, मैं उपयोगकर्ता से पूछ सकता हूं (यह प्रोग्रामर के लिए एक उपकरण है, इसलिए इसके साथ कोई समस्या नहीं है), लेकिन अगर मैं अभी पता लगाता हूं तो यह बहुत अच्छा होगा।


जवाबों:


267

जाँच करें कि कोई पर्यावरण चर कहा जाता है:

$SSH_CLIENT 

या

$SSH_CONNECTION

(या कोई अन्य पर्यावरण चर) जो उपयोगकर्ता के लॉग इन करने पर सेट हो जाता है। फिर उपयोगकर्ता लॉगिन स्क्रिप्ट का उपयोग करके इसे संसाधित करें।

आईपी ​​निकालें:

$ echo $SSH_CLIENT | awk '{ print $1}'
1.2.3.4
$ echo $SSH_CONNECTION | awk '{print $1}'
1.2.3.4

@cwd क्या मैं इस कमांड में ip को बदलना चाहता हूं "iptables-IN INUTUT -s 93.203.118.251 -p tcp --destination-port 443 -j DROP" क्या यह संभव है?
13

2
यह मेरे लिए REMOTEHOST था।
19

5
केवल गैर-sudoed उपयोगकर्ताओं के साथ काम करता है। उदाहरण के लिए, यदि आपके पास एक ssh उपयोगकर्ता है और फिर रूट करने के लिए आगे बढ़ा है, तो एक नया शेल बनाया गया है और ये चर खो गए हैं, जब तक कि आप मूल ssh pid को खोजने और / खरीद / $ PID / environ से चर प्राप्त करने के लिए पेड़ के माध्यम से वापस ट्रेस नहीं कर सकते।
Andrej

5
करने के लिए धन्यवाद stackoverflow.com/questions/428109/extract-substring-in-bash इस जवाब बस के लिए सुधार किया जा सकता${SSH_CLIENT%% *}
जेफ

@ ऑन्ड्रेज में देखेंsudo -E
जेफ

105

आप कमांड का उपयोग कर सकते हैं:

server:~# pinky

यह आपको कुछ इस तरह देगा:

Login      Name                 TTY    Idle   When                 Where 

root       root                 pts/0         2009-06-15 13:41     192.168.1.133

13
यह बहुत बढ़िया है :-) बेवकूफ बेवकूफ एक बार फिर से। के अनुसार pinky --help:A lightweight 'finger' program; print user information. The utmp file will be /var/run/utmp.
क्रिस वुड्स

मेरे आउटपुट में यह मेरा 'कहाँ' है जो केवल मशीन का नाम दिखाता है न कि आईपी एड्रेस?
गगनैस्टरन

संभवत: आपको अपने मशीन में नेमसर्वर कॉन्फ़िगर किया गया हो।
vncprado

पिंकी सभी लॉग इन यूजर्स को दिखाएगी , सिर्फ अपने आप को नहीं
Andrej

33

केवल IP पता प्राप्त करने के लिए निम्नलिखित प्रयास करें:

who am i|awk '{ print $5}'

बहुत यकीन है कि अगर आप whoami लिखते हैं और आपको उपयोगकर्ता में लॉग इन का नाम मिलेगा। क्षमा करने के लिए कोई पांचवी बात या आईपी नहीं है। लेकिन whoami एक उपयोगी कमांड है
gerard

15
who am i! = whoamiमेरी लिनक्स पर कम से कम। एक पांचवीं बात है, और यह क्लाइंट का होस्ट नाम है।
kulgrien

5
किसी और के बारे में सोच who am iरहे whoहैं: के लिए मैनपेज कहते हैं If ARG1 ARG2 given, -m presumed: 'am i' or 'mom likes' are usual.:। तो वास्तव में दो शब्दों के साथ कुछ भी काम करता है, जैसी चीजें भी who likes icecream
jmiserez

3
इस उत्तर पर निर्माण करते हुए, मैंने इसे कम कर दिया who -m --ips|awk '{print $5}'ताकि मेरे पास केवल आईपी हो और कोई रिवर्स-डीएनएस उत्तर न हो। मदद के लिए धन्यवाद who am i!
यवन

1
Tmux के साथ असफल: who am i|awk '{ print $5}' (tmux(2445).%3)
एलेक्स रोश



5
who am i | awk '{print $5}' | sed 's/[()]//g' | cut -f1 -d "." | sed 's/-/./g'


export DISPLAY=`who am i | awk '{print $5}' | sed 's/[()]//g' | cut -f1 -d "." | sed 's/-/./g'`:0.0

मैं सत्र के लिए अपने प्रदर्शन चर का निर्धारण करने के लिए इसका उपयोग ssh में लॉग इन करते समय करता है और दूरस्थ X को प्रदर्शित करने की आवश्यकता होती है।


मेरे आईपी को .htaccess फ़ाइलों में जोड़ने के लिए उपयोगी एक लाइनर। धन्यवाद। मैंने FreeBSD के लिए एक संशोधन किया है: who am i | awk '{print $6}' | sed 's/[()]//g' | sed 's/\./\\./g' अंतिम भाग डॉट्स से बच जाता है।
ओलिवियर -

5

पूर्व उत्तर पर सुधार। होस्टनाम के बजाय आईपी एड्रेस देता है। - ओएस एक्स पर उपलब्ध नहीं।

who am i --ips|awk '{print $5}' #ubuntu 14

अधिक सार्वभौमिक, OS X 10.11 के लिए $ 5 से $ 6 बदलें:

WORKSTATION=`who -m|awk '{print $5}'|sed 's/[()]//g'`
WORKSTATION_IP=`dig +short $WORKSTATION`
if [[ -z "$WORKSTATION_IP" ]]; then WORKSTATION_IP="$WORKSTATION"; fi
echo $WORKSTATION_IP


2

आप इसे SSH लाइब्रेरी ( https://code.google.com/p/sshxcute ) के माध्यम से प्रोग्रामेटिक तरीके से प्राप्त कर सकते हैं

public static String getIpAddress() throws TaskExecFailException{
    ConnBean cb = new ConnBean(host, username, password);
    SSHExec ssh = SSHExec.getInstance(cb);
    ssh.connect();
    CustomTask sampleTask = new ExecCommand("echo \"${SSH_CLIENT%% *}\"");
    String Result = ssh.exec(sampleTask).sysout;
    ssh.disconnect();   
    return Result;
}

1

netstat काम करेगा (कुछ इस तरह शीर्ष पर) tcp 0 0 10.x.xx.xx: ssh someipaddress.or.domainame: 9379 ESTABLISHED


इस उत्तर के लिए बहुत बहुत धन्यवाद, मैं 'netstat | grep ssh '।
रॉस ऐकेन

सुरक्षा कारणों से यह बुरा है क्योंकि कोई भी उस बंदरगाह से जुड़ा हो सकता है, न कि केवल आप।
CrazyCasta

1
netstat -tapen | grep ssh | awk '{ print $10}'

आउटपुट:

मेरे प्रयोग में दो #

netstat -tapen | grep ssh | awk '{ print $4}' 

आईपी ​​पता देता है।

आउटपुट:

127.0.0.1:22 # in my experiment

लेकिन परिणाम अन्य उपयोगकर्ताओं और सामान के साथ मिश्रित होते हैं। इसके लिए और काम करने की जरूरत है।


मेरा नेटस्टैट केवल IPv6 और "127.0.0.1:22" के लिए एक काट-छाँट वाला पता देता है, जो क्लाइंट के बजाय सर्वर है, (जो प्रश्न में निर्दिष्ट किया गया था।)
एलेक्स रोश

1

बहुत सारे जवाबों के साथ एक पुराना धागा, लेकिन कोई भी ऐसा नहीं है जिसकी मुझे तलाश थी, इसलिए मैं अपना योगदान दे रहा हूं:

sshpid=$$
sshloop=0
while [ "$sshloop" = "0" ]; do
        if [ "$(strings /proc/${sshpid}/environ | grep ^SSH_CLIENT)" ];
then
                read sshClientIP sshClientSport sshClientDport <<< $(strings /proc/${sshpid}/environ | grep ^SSH_CLIENT | cut -d= -f2)
                sshloop=1
        else
                sshpid=$(cat /proc/${sshpid}/status | grep PPid | awk '{print $2}')
                [ "$sshpid" = "0" ] && sshClientIP="localhost" && sshloop=1
        fi
done

यह विधि प्रत्यक्ष ssh, sudoed उपयोगकर्ताओं और स्क्रीन सत्र के साथ संगत है। जब तक यह SSH_CLIENT चर के साथ एक पीआईडी ​​नहीं मिल जाता है, तब तक यह प्रक्रिया के पेड़ के माध्यम से आगे बढ़ेगा, फिर इसके आईपी को $ sshClientIP के रूप में रिकॉर्ड करें। यदि यह पेड़ से बहुत दूर हो जाता है, तो यह आईपी को 'लोकलहोस्ट' के रूप में दर्ज करेगा और लूप को छोड़ देगा।


0

आमतौर पर / var / log / संदेश (या समान, अपने OS पर निर्भर करता है) में एक लॉग एंट्री होती है, जिसे आप उपयोगकर्ता नाम के साथ देख सकते हैं।


0

लिनक्स: मैं कौन हूँ | awk '{प्रिंट $ 5}' | sed 's / [()] // g'

AIX: मैं कौन हूँ | awk '{प्रिंट $ 6}' | sed 's / [()] // g'


0

"Myusername" खाते के लिए SSH कनेक्शन खोजें;

पहले परिणाम स्ट्रिंग लें;

5 वां कॉलम लें;

":" से विभाजित करें और 1 भाग लौटें (पोर्ट नंबर की जरूरत नहीं है, हम सिर्फ आईपी चाहते हैं):

netstat -tapen | grep "sshd: myusername" | सिर -n1 | awk '{विभाजन ($ 5, ए, ":"); प्रिंट [1]} '


दूसरा रास्ता:

मैं कौन हूँ | awk '{l = लंबाई ($ 5) - 2; प्रिंट पदार्थ ($ 5, 2, l)} '


sudo ss -tapen | grep "sshd: $(whoami)"|head -n1|awk '{split($5, a, ":"); print a[1]}'कहते हैं, मेरे ssh क्लाइंट से है 2a02और आपका "एक और तरीका:" कहता हैtmux(2445).%3
Alexx Roche

0

यह मानते हुए कि वह एक संवादात्मक सत्र खोलता है (जो एक छद्म टर्मिनल आवंटित करता है ) और आपके पास स्टडिन तक पहुंच है, आप डिवाइस नंबर (/ देव / pts / 4711) प्राप्त करने के लिए उस उपकरण पर एक ioctl कॉल कर सकते हैं और उस एक को खोजने का प्रयास कर सकते हैं। / var / run / utmp (जहां उपयोगकर्ता नाम और IP पता भी होगा जो कनेक्शन से उत्पन्न हुआ है)।


0

@ निखिल कात्रे के जवाब के लिए एक अंगूठा:

पिछले 10 उपयोगकर्ताओं को मशीन में लॉग इन करने के लिए सबसे सरल कमांड है last|head

सभी उपयोगकर्ताओं को पाने के लिए बस lastकमांड का उपयोग करें

मूल रूप से जो उपयोग किया जाता है whoया pinkyकिया जाता है। लेकिन लेकिन लेकिन वे ऐतिहासिक सत्रों की जानकारी नहीं देते हैं।

यह भी दिलचस्प हो सकता है यदि आप किसी ऐसे व्यक्ति को जानना चाहते हैं जिसने इस चेकिंग को शुरू करते समय पहले ही लॉग इन और लॉग आउट किया हो।

अगर यह एक बहुउद्देशीय प्रणाली है। मैं आपको उस उपयोगकर्ता खाते को जोड़ने की सलाह देता हूं जिसे आप देख रहे हैं:

last | grep $USER | head

संपादित करें:

मेरे मामले में, $ SSH_CLIENT और $ SSH_CONNECTION दोनों मौजूद नहीं हैं।


0

पिछले 10 उपयोगकर्ताओं को मशीन में लॉग इन करने के लिए सबसे सरल कमांड है last|head। सभी उपयोगकर्ताओं को प्राप्त करने के लिए, बस lastकमांड का उपयोग करें


0

मुझे who -m --ipsडेबियन 10 पर निम्न आउटपुट मिल रहा है :

रूट पीटीएस / 0 दिसंबर 4 06:45 123.123.123.123

ऐसा लगता है कि एक नया स्तंभ जोड़ा गया था, इसलिए {print $5}या " 5 वां कॉलम लें " प्रयास अब काम नहीं करते हैं।

इसे इस्तेमाल करे:

who -m --ips | egrep -o '([0-9]{1,3}\.){3}[0-9]{1,3}'

स्रोत:

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