Cara mengkonfigurasi perintah untuk dijalankan saat login, tetapi hanya jika melalui telnet


2

Saya ingin menjalankan perintah setiap kali saya masuk ke kotak Ubuntu saya, tetapi hanya jika saya terhubung melalui telnet, tidak jika saya masuk di konsol.

Jawaban:


2

Sesuatu seperti ini di .bashrc Anda (dengan asumsi bash) akan bekerja dengan cukup baik:

if ( tty | egrep -q '\/pts\/' )
then
   echo "is a pts - remote login"
else
   echo "is not a pts - local login"
fi

Anda hanya akan mengganti gema dengan apa pun yang ingin Anda jalankan.


Sebuah pty juga akan dialokasikan untuk terminal X atau jendela 'layar', jadi ini tidak terlalu bisa diandalkan.
grawity

Saya membuka beberapa terminal windows terbuka ketika saya login di konsol ...
moswald

Ya, ini tidak akan cukup baik. Itu menyebabkan semua jendela terminal X untuk mencetak 'is a pts - remote login'.
moswald

0

telnet? Saya tidak merekomendasikan penggunaannya! Salah satu pendekatan berikut harus bekerja untuk sebagian besar metode akses jarak jauh. (Akses jarak jauh melalui klien X, atau melalui VNC atau sejenisnya menjadi pengecualian yang dapat dimaafkan.)

  • beberapa telnetdmengatur variabel lingkungan REMOTEHOSTatau serupa yang dapat Anda periksa
  • jika Anda menjalankan, xinetdAnda dapat mengubah telnetdlingkungan melalui envatribut
  • jika Anda benar-benar bermaksud ssh(OpenSSH), maka Anda dapat memeriksa salah satu variabel SSH_TTYdan SSH_CONNECTION.

Terminal virtual konsol Linux (sebelum Anda mulai X) akan memiliki nama tty seperti /dev/tty1daripada pty (pseudo-ttys) di /dev/pts/(setidaknya pada x86). Dalam X, terminal akan dialokasikan ptys.

Memeriksa variabel lingkungan sering dapat digerogoti oleh pengguna, jika itu menjadi perhatian.

Solusi kasus umum yang lebih kuat adalah dengan berjalan di pohon proses dari $$, sampai Anda menemukan apa yang Anda cari (atau tidak), gunakan ini dalam bashskrip:

function checkparents() 
{
    local _proc=$1 _pid _ppid=$$ _tty="" _comm _rc=1

    while [ "$_ppid" != "1" ]; do
        read _pid _ppid _tty _comm < <(ps --no-headers -p $_ppid -o "pid ppid tty comm")
        #echo "$_pid $_ppid $_tty $_comm"
        [ "$_comm" = "$_proc" ] && { _rc=0; break; }
        [ "$_pid"  = "$_proc" ] && { _rc=0; break; }
    done
    return $_rc
}

Saat dijalankan melalui sshlogin misalnya:

$ if checkparents sshd; then echo ssh; fi
ssh
$ if ! checkparents in.telnetd; then echo not telnet; fi
not telnet

Batalkan komentar pada echobaris untuk melihatnya berfungsi.


0

Saya pribadi menahan output dari "who am i" untuk alasan lain (pengaturan DISPLAY). Bidang terakhir tampaknya adalah "sumber" dari login

    typeset -a LOGINARRAY
    # who am I format: USER TTY MON DAY TIME LOGINHOST, 
    # use array to get last entry
    LOGINARRAY=( $(/usr/bin/who -sum) )
    LASTINDEX=$(( ${#LOGINARRAY[*]} - 1))
    LOGINHOST=${LOGINARRAY[$LASTINDEX]}
    LOGINHOST=${LOGINHOST##*\(}
    LOGINHOST=${LOGINHOST%%)*}
    DISPLAY=$LOGINHOST:0
    export DISPLAY

    unset LOGINARRAY LASTINDEX

seharusnya cukup mudah untuk memeriksa format LOGINHOST untuk melihat apakah itu login "jarak jauh". telnet dinonaktifkan di sini (sebagaimana mestinya) jadi saya tidak dapat secara eksplisit memeriksa untuk melihat bagaimana pengaturannya untuk telnet

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.