मुझे बस बश का उपयोग करते हुए लिनक्स में एक ही समस्या थी। मैंने पहले पर्यावरण चर 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 ...