শেলটি এসএসএইচ থেকে নিয়ন্ত্রণ করা হয় কিনা আমি কীভাবে সনাক্ত করতে পারি?


69

আমি শেল স্ক্রিপ্ট থেকে সনাক্ত করতে চাই (আরও নির্দিষ্টভাবে .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/…
বালুপটন

1
আপনি নিজের শেল কনফিগারেশনে এটি করতে চাইতে পারেন যদি আপনি আপনার দূরবর্তী শেল থেকে এসএসএল এজেন্ট ফরওয়ার্ডিং সক্ষম করতে চান (যেহেতু পরিবেশের ভারগুলি প্রতিটি শেল থেকে আপনাকে এগিয়ে নিতে চান সেগুলি সেট করা দরকার) যদি না আমি কিছু মিস করছি?
আউটরান

@ندرরুন আমি আপনার বক্তব্য বুঝতে পারি না। যদি আপনি একই সেশনে অন্য একটি শেল চালনা করেন তবে এটি দ্বারা নির্ধারিত পরিবেশের পরিবর্তনগুলি উত্তরাধিকার সূত্রে প্রাপ্ত হয় .profile। এবং এজেন্ট ফরওয়ার্ডিংয়ের সাথে এর কী সম্পর্ক?
গিলস

1
@ আন্ডাররুন আপনি যদি এসএসএইচ এজেন্ট ফরওয়ার্ডিংয়ের উপস্থিতি পরীক্ষা করতে চান তবে SSH_AUTH_SOCKভেরিয়েবলের জন্য পরীক্ষা করুন । তবে আপনি কেন সেই ক্ষেত্রে এসএসএইচ এজেন্ট চালাবেন? আপনি যদি এজেন্ট ফরওয়ার্ডিং না করে লগ ইন করেন তবে আপনি কি কোনও এজেন্ট শুরু করার অর্থ দিয়েছিলেন? ইতিমধ্যে যদি একটি ( [ -n "$SSH_AUTH_SOCK" ] || eval $(ssh-agent)) না থাকে তবে এজেন্ট শুরু করবেন না কেন ?
গিলস

1
@ প্রক্সিওলিটিক SSH_*ভেরিয়েবলগুলি একটি এসএসএইচ সেশনের শীর্ষে থাকা শেলের সাবপ্রসেসিসগুলিতেও সেট করা থাকে, উদাহরণস্বরূপ আপনি যদি এসএসএইচের উপর একটি স্ক্রিন সেশন শুরু করেন (আপনি যদি যত্নশীল হন তবে সেশন শুরু করার আগে আপনার ভেরিয়েবলগুলি আনসেট করা উচিত)। আমি মনে করি পিতামাতার প্রক্রিয়াটি পরীক্ষা করার কারণটি হ'ল আমি এসএসডিডি কোনও পরিবেশের ভেরিয়েবল সংজ্ঞায়নের আগে এটি শুরু করেছিলাম।
গিলস 21

21

আপনি মাধ্যমে চেক করতে সক্ষম হওয়া উচিত SSH_TTY, SSH_CONNECTIONঅথবা SSH_CLIENTভেরিয়েবল।


1
এছাড়াও এই যোগ env_keepমধ্যে sudoersএটি জুড়ে কাজ করতে suকমান্ড :)
টমাস জি

10

আমার সবেমাত্র লিনাক্সে একই সমস্যা ছিল, ব্যাশ ব্যবহার করে। আমি প্রথমে এনভায়রনমেন্ট ভেরিয়েবল SSH_CONNECTION ব্যবহার করেছি, কিন্তু তারপরে বুঝতে পেরেছি যে এটি সেট না থাকলে আপনি করুন su -

উপরের লাস্টলগ সমাধান পরে suবা পরে কাজ করে নি su -

অবশেষে, আমি ব্যবহার করছি who am i, এটি কোনও এসএসএইচ সংযোগ থাকলে শেষ পর্যন্ত দূরবর্তী আইপি (বা হোস্টনাম) দেখায়। এটি su এর পরেও কাজ করে।

বাশ নিয়মিত এক্সপ্রেশন ব্যবহার করে, এটি কাজ করে:

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

যদি zsh নিয়মিত এক্সপ্রেশন সমর্থন করে না, গ্রাপ, কাটা, সেড বা যেকোনো কিছু দিয়ে একই বিভিন্ন উপায়ে অর্জন করা যায়।

কৌতূহলের জন্য, নীচেরটি আমি এটির জন্য মূলের .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সেশনে কাজ করে না এবং আইপিভি 6 এর মাধ্যমে লগ ইন করা থাকলে এবং কোনও ডিএনএস বিপরীত নাম উপস্থিত থাকলে সমস্যাও রয়েছে।
Bene

@ বেন: কি কাজ করে না? নিয়মিত প্রকাশ, বা who am iআপনার আইপিভি 6 ঠিকানা প্রদর্শন করে না?
mivk

1) who am iদূরবর্তী tmuxসেশনে কোনও কিছুই ফেরত দেয় না । 2) আইপিভি 6 ঠিকানায় এমন কলোন থাকতে পারে যা আপনার রেজেক্স অনুমতি দেয় না। এটি আমার পক্ষে এক্স সেশনে (এক্সটার্ম) who am iঅন্তর্ভুক্ত হওয়ার পরে এটি জটিল হতে পারে (:0.0)
Bene

@ বেইন: বিকল্প সমাধান যা আমি সবে যুক্ত করেছি তাও আইপিভি 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

একটি এসএসএইচ লগইন জন্য।

আমার সিস্টেমে, এটি এটি নিষ্কাশন করতে কাজ করে

$ 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

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