SSH ile giriş yaptığımı nasıl belirleyebilirim?


17

Şu anda birden fazla makinede kullanılacak oldukça karmaşık bir bash yapılandırması kuruyorum. SSH ile mi yoksa yerel bir makinede mi oturum açtığımı belirlemenin mümkün olup olmadığını bulmaya çalışıyorum. Bu şekilde, örneğin, bu gerçeğe bağlı olarak bazı takma adlar ayarlayabilirim. Takma ad haltvermek gibi restartuzak bir sunucuyu durdurmak gibi yapmak en iyi şey olmayabilir.

Şimdiye kadar bildiğim şey, SSH_CLIENTssh aracılığıyla giriş yaptığımda ortam değişkeninin ayarlanmış olmasıdır. Ne yazık ki, bir süper kullanıcı kabuğu ile başlattığımda bu değişken atılır sudo -s. Ayrıca sudo'ya tüm çevre değişkenlerimi yeni kabuk ortamına kopyalamasını bildiren sudo'ya bir parametre iletebileceğimi biliyorum, ancak bunu yapmak istemiyorsam başka bir yol var mı?

Yanıtlar:


14

"W" veya "who" komut çıktısını kullanabilirsiniz. Ssh üzerinden bağlandığınızda, kaynak IP'nizi gösterirler.


1
Eğitimli tahminler yapın. Örneğin, run ps afxve kabuk çalışmayan TTY psdiğer giriş olacaktır.
Warner

6
Kullanın who am i.
Paul Tomblin

1
"uname -n" ev
sahibinin

1
Soru who am i, onu çıkarmak için daha alakalı görünüyor , böylece SSHing olup olmadığınızı buradan belirleyebilirsiniz. Bu çalışıyor:hostname=$(who am i | cut -f2 -d\( | cut -f1 -d:)
blueyed

4
@PaulTomblin Aslında, whofazladan iki argümanla kullanabilirsiniz. who am iAynı gibidir who is meya da who is awesomeya da who potato potato. Biraz ilginç bulduğum bir gerçek.
kirkpatt

9

Unix.stackexchange'te bulduğum harika bir cevap :


  • Değişkenlerden biri SSH_CLIENTveya SSH_TTYtanımlanmışsa, bu bir ssh oturumudur.
  • Giriş kabuğunun üst süreci ile kontrol edilebilir ps -o comm= -p $PPID. Eğer öyleyse sshd, bu bir ssh oturumu.
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

Sudo -s için çalışmaz
Matt

6

Sen ekleyebilir SSH_*için env_keepde sudoersbu diğer kullanıcıya açık iken tespit edilebilir şekilde yerleştirin.


4

Eğer kabuk bash doğrudan sshd (n> 1 katman derin değil) bir alt süreç olup olmadığını bilmek istiyorsanız

cat / proc / $ PPID / durum | kafa -1 | kes -f2

size sshdveya geçerli kabuğunuzun üst işlem adı ne olursa olsun vermelidir .


Sudo -s için çalışmaz
Matt

ps -o cmd= $PPIDveyaawk '/^Name:/ {print $2}' /proc/$PPID/status
Altı

3

Sanırım problemi düşünme şeklinizi yeniden düşünmek istiyorsunuz. Soru "SSH üzerinden oturum açmış mıyım, çünkü belirli komutları kapatmak istiyorum." Bu "konsolda oturum açtım mı, çünkü o zaman belirli komutları etkinleştireceğim."


3

Evet, diğerleri belirtildiği gibi, bilgi çıkışında parantez içinde IP'nizin varlığındadır who am i.

Bash düzenli ifadelerini algılamak için kullanabilirsiniz:

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

1
Ayrıca bir ana bilgisayar adı da olabilir.
blueyed

Ana bilgisayar adı sayı içeriyorsa çalışmaz.
YoYoYonnY

1

Buradaki diğerlerinin ipuçlarına dayanarak aşağıdakileri buldum.

Önbellekleme için bir değişken kullanır - Kabuk temamda kullanıyorum.

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
}

Kaynak: is_sshin https://github.com/blueyed/oh-my-zsh/blob/master/themes/blueyed.zsh-theme#L51-63 .


0

Kabuğunuzun ana cmdline'ını ve tekrarını arayın. Belki aşağıdaki gibi bir şey:

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

Aslında çalışması için düzenlendi :)


0

İlk giriş seviyesinde iseniz diğer tüm cevaplar işe yarar. Ancak, bir kez giriş yaptıktan sonra, 'su' veya 'sudo' çalıştırırsam (benim durumumda, güvenlik nedeniyle kabuksuz bir kullanıcı hesabına geçmek için, şunu çalıştırmam gerekiyordu: sudo su - <userid> -s / bin / bash - l) çözeltileri başarısız olur.

Aşağıdaki evrensel bir çözümdür; pstree kullanarak, sshd'yi ebeveyn olarak kontrol edersiniz.

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

İşte --quiet kaldırıldığında egrep'in çıktısı. Uzaktan bağlanırsa eşleşen hiyerarşinin tamamını gösterir.

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

0

Lütfen bu cevabın çok, çok Linux'a özgü olduğunu unutmayın.

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

Bu önemli bir varsayım yapar: giriş işleminin kontrol eden bir TTY'si yoktur; muhtemelen olmadığını kontrol etmek istiyorum var (zaten ihtiyaçlarınız dayalı, muhtemelen bir sakınca yoktur) bu kodu çalıştırmadan önce kontrol TTY'yi.

Kod, kontrol eden TTY'ye sahip olmayan işlemi bulana kadar işlem ağacı boyunca yukarı doğru yinelenir. $initiator_namebu işlemin adı olacaktır (örneğin "sshd").

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.