আমি এসএসএইচ এর মাধ্যমে লগ ইন করেছি কিনা তা কীভাবে নির্ধারণ করবেন?


17

আমি বর্তমানে একটি বেশ জটিল বাশ কনফিগারেশন সেট আপ করছি যা একাধিক মেশিনে ব্যবহৃত হবে। আমি এসএসএইচ এর মাধ্যমে বা স্থানীয় মেশিনে লগ ইন করেছি কিনা তা নির্ধারণ করা সম্ভব কিনা তা জানার চেষ্টা করি। এই উপায়ে আমি উদাহরণস্বরূপ, সেই তথ্যের উপর নির্ভর করে কিছু উপকরণ সেট করতে পারি। Aliasing মতো haltকরতে restartযেহেতু একটি দূরবর্তী সার্ভারে বাঁধন করতে সবচেয়ে ভালো জিনিস হতে নাও হতে পারে।

আমি এখন পর্যন্ত যা জানি তা হ'ল SSH_CLIENTএসএসের মাধ্যমে লগ ইন করার সময় পরিবেশের পরিবর্তনশীল সেট করা থাকে। দুর্ভাগ্যক্রমে, যখন আমি একটি সুপার ব্যবহারকারী শেল দিয়ে শুরু করি তখন এই পরিবর্তনশীলটি বাতিল করা হয় sudo -s। আমি আরও জানি যে আমি সুডোতে এমন একটি পরামিতিটি পাস করতে পারি যা আমার সমস্ত পরিবেশের পরিবর্তনগুলি নতুন শেল এনভায়রনমেন্টে অনুলিপি করতে সুদকে নির্দেশ দেয় তবে আমি যদি এটি না করতে চাই তবে অন্য কোনও উপায় আছে কি?

উত্তর:


14

আপনি "w" বা "কারা" কমান্ড আউটপুট ব্যবহার করতে পারেন। আপনি যখন ssh এর সাথে সংযুক্ত হন, তারা আপনার উত্স আইপি প্রদর্শন করবে।


1
শিক্ষিত অনুমান করুন। উদাহরণস্বরূপ, চালান ps afxএবং শেলটি চালিত না হওয়ার জন্য টিটিওয়াই psঅন্য লগইন হবে।
ওয়ার্নার

6
ব্যবহার who am i
পল টমলিন

1
"আনমেমে-এন" আপনাকে হোস্টের নাম দেবে
হুবার্ট কারিও

1
প্রশ্নটি এখান থেকে উত্তোলনের সাথে আরও সম্পর্কিত বলে মনে হচ্ছে who am i, যাতে আপনি এসএসএইচিং করছেন কিনা তা আপনি সেখান থেকে নির্ধারণ করতে পারেন। এটি কাজ করে:hostname=$(who am i | cut -f2 -d\( | cut -f1 -d:)
নীল রঙের

4
@ পলটম্বলিন আসলে, আপনি যে whoকোনও দুটি অতিরিক্ত যুক্তি দিয়ে ব্যবহার করতে পারেন । who am iএকই হিসাবে who is meবা who is awesomeবা who potato potato। আমি একটি সত্য কিছু আকর্ষণীয় পেয়েছি।
কিরকপ্যাট

9

এখানে ইউনিক্স.স্ট্যাকেক্সেঞ্জারে আমি একটি দুর্দান্ত উত্তর পেয়েছি :


  • যদি ভেরিয়েবলগুলির মধ্যে একটি SSH_CLIENTবা SSH_TTYসংজ্ঞায়িত হয় তবে এটি একটি ssh অধিবেশন।
  • লগইন শেলের প্যারেন্ট প্রক্রিয়াটি দিয়ে পরীক্ষা করা যায় ps -o comm= -p $PPID। যদি এটি হয় তবে এটি sshdএকটি ssh অধিবেশন।
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

সুডো-এসের জন্য কাজ করে না
ম্যাট

6

আপনি যোগ করতে পারিনি SSH_*করার env_keepমধ্যে sudoersযাতে এই সময় অন্যান্য ব্যবহারকারীর স্যুইচ সনাক্ত করা যাবে।


4

যদি আপনি জানতে চান যে আপনি বাশ শেলটি সরাসরি sshd এর একটি শিশু প্রক্রিয়া (n> 1 স্তর গভীর নয়) আপনি করতে পারেন

cat / proc / proc পিপিআইডি / অবস্থা | মাথা -1 | কাটা -ফ 2

এটি আপনাকে 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
এটি একটি হোস্টের নামও হতে পারে।
নীল রঙের

হোস্টনেমে সংখ্যা থাকলে কাজ করে না।
YoYoYonnY

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

আপনার শেলের প্যারেন্ট সেন্টিমিডলাইন এবং পুনরাবৃত্তি অনুসন্ধান করুন। নিম্নলিখিতগুলির মতো কিছু হতে পারে:

#!/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

আপনি লগইনের প্রথম স্তরে থাকলে অন্যান্য সমস্ত উত্তর কাজ করে। তবে, একবার লগইন করার পরে আপনি 'সু' বা 'সুডো' চালান (আমার ক্ষেত্রে, সুরক্ষার কারণে শেল ছাড়াই কোনও ব্যবহারকারীর অ্যাকাউন্টে স্যুইচ করতে, আমাকে চালাতে হয়েছিল: sudo su - <userid> -s / bin / bash - l) , তাদের সমাধান ব্যর্থ।

নিম্নলিখিতটি একটি সর্বজনীন সমাধান; 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

এটি একটি মূল অনুমান করে: লগইন প্রক্রিয়াতে একটি নিয়ন্ত্রণকারী টিটিওয়াই থাকবে না; আপনি সম্ভবত এই কোডটি চালানোর আগে আপনার নিয়ন্ত্রণকারী টিটিওয়াই আছে কিনা তা যাচাই করতে চান (যা আপনার প্রয়োজনীয়তার উপর ভিত্তি করে সম্ভবত কোনও নিরাপদ বাজি, যাইহোক)।

কোডটি প্রক্রিয়া ট্রি দিয়ে উপরের দিকে পুনরাবৃত্তি করে, যতক্ষণ না এটি প্রক্রিয়াটি আবিষ্কার করে যার কোনও নিয়ন্ত্রণকারী টিটিওয়াই নেই। $initiator_nameএই প্রক্রিয়াটির নাম হবে (উদাহরণস্বরূপ "sshd")।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.