Jalankan skrip (sistem) pada masuk dan / atau keluar SSH

12

Saya ingin server OpenSSH saya untuk memulai skrip setiap kali pengguna login menggunakan SSH, idealnya melewati nama host atau IP, serta nama pengguna. Selain itu saya ingin menjalankan skrip, setiap kali sesi diakhiri (melewati nama pengguna). Skrip ini tidak boleh berjalan di sesi pengguna, tetapi di seluruh sistem.

Idenya adalah untuk memberikan peringatan audio saat masuk dan keluar, misalnya menggunakan espeak, dan untuk menampilkan informasi pada layar eksternal.

Saya telah melihat bahwa ada pam-scriptspaket tetapi saya tidak yakin apakah ini melakukan apa yang saya inginkan, atau bagaimana menggunakannya.

di bawah sinar matahari
sumber

Jawaban:

10

Anda bisa memaksakan perintah ke pengguna SSH Anda alih-alih yang mereka minta (atau shell mereka jika mereka tidak memberikan perintah tertentu). Ini dapat dilakukan dengan menentukan perintah dengan sesuatu seperti ForceCommand /root/ssh-wrapperdi /etc/ssh/sshd_config(tidak masalah di mana skrip berada atau bagaimana namanya, pastikan saja itu dapat dieksekusi oleh semua pengguna dan file konfigurasi sshd menunjuk ke sana). Anda juga perlu memulai ulang / memuat ulang sshd. The perintah asli dapat diakses dengan perintah paksa sebagai $SSH_ORIGINAL_COMMAND.

Saya baru saja meretas skrip ini bersama-sama:

#! /bin/sh

# add logger options when needed
log="logger -t ssh-wrapper"

# find IP address
ip=`echo $SSH_CONNECTION | cut -d " " -f 1`

$log $USER login from $ip
espeak "$USER just logged in from $ip" > /dev/null 2>&1

$log command: ${SSH_ORIGINAL_COMMAND:-shell}
${SSH_ORIGINAL_COMMAND:-shell}

$log $USER logout
espeak "$USER just logged out" > /dev/null 2>&1

Sekarang setiap kali saya login atau logout, suara memberi tahu saya tentang hal itu, dan entri log ditulis ke syslog. Itu juga mencatat perintah. Anda dapat menggunakan sesuatu seperti berikut untuk "mengikuti" penggunaan sshd Anda:

tailf /var/log/syslog | grep ssh-wrapper

Harap perhatikan bahwa skrip ini sebagian besar belum teruji, jadi gunakan dengan risiko Anda sendiri! ;-)

PS: ingat bahwa skrip ini dijalankan sebagai pengguna yang masuk, jadi Anda tidak dapat melakukan semua yang Anda inginkan jika Anda mengubahnya untuk menambahkan lebih banyak fitur ...

JanC
sumber
Hai, Apakah ada cara untuk mendeteksi situasi ketika pengguna baru saja menutup jendela dengan klien ssh. Skrip Anda tidak mengaitkan situasi ini .. Terima kasih.
Dmitry Eskin
Haruskah shelldalam $ {SSH_ORIGINAL_COMMENT: -shell} diganti dengan path aktual ke shell, misalnya. / bin / bash? Ketika saya mencoba menjalankannya, ia mengeluh bahwa tidak ada perintah seperti shell. Sebenarnya, saya kira mungkin yang Anda maksud adalah $ SHELL? Itu harus menjalankan shell yang ditentukan pengguna.
Ibrahim
1

Saya telah melihat peristiwa yang cocok ini dalam file log sebelumnya (yang akan memungkinkan Anda fleksibilitas dalam mencocokkan apa pun). Halaman ini diformat dengan buruk tetapi mungkin bisa membantu Anda memulai: https://help.ubuntu.com/community/AudibleLogs#Play dengan esound

kanaka
sumber
Saya pikir Anda / mereka maksudkan espeakbukan esound?
JanC
0

(Jawab lintas-posting dari pertanyaan yang sama pada ServerFault )

Cukup tulis skrip untuk melakukan apa pun yang Anda inginkan lalu tempelkan /etc/profileatau mungkin /etc/bash.bashrctergantung kebutuhan Anda. Perubahan pada file-file itu akan berlaku untuk semua pengguna. Saya tidak yakin bagaimana Anda akan memberitahukan tentang logout dengan pendekatan ini.

Atau, cara lain untuk melakukan ini adalah dengan memiliki daemon pemantauan sederhana /var/log/authuntuk sesi ssh baru (dan penutup). Dengan begitu, ia dapat mengirim notifikasi pada saat masuk dan keluar.

EEAA
sumber
0

Anda dapat menggunakan sshrc (man sshd, cari sshrc)

ssh akan menjalankan / etc / ssh / sshrc jika ada dan Anda dapat menjalankan satu skrip (atau memanggil beberapa skrip) dari sana

Anda dapat memanggil variabel bash apa pun, menyukai $USERatau mendapatkan IP melalui

read -d " " ip <<< $SSH_CONNECTION

Anda dapat menulis skrip untuk menguji atau mencatat apa yang Anda inginkan.

Skrip logout ... yah, itulah yang saya cari! : D

higuita
sumber
0

Saya pikir PAM adalah pilihan terbaik. Seluruh sistem dan tidak dapat ditimpa oleh file konfigurasi pengguna.

Anda dapat mengikuti langkah-langkah ini. Mereka bekerja untuk saya di Ubuntu 14.04.4 LTS.

Lari:

$ sudo pico /opt/custom/bin/info-session.sh

Edit file kosong itu dan tambahkan baris ini:

#!/bin/sh

[ "$PAM_TYPE" = "open_session" ] || exit 0

INFO=$(date +"%Y/%m/%d %T $PAM_USER ($PAM_RHOST) $PAM_SERVICE $PAM_TTY") # You can customize message.

echo "PAM access: $INFO" | write user > /dev/null 2>&1 # See Note 1.

exit 0

Setelah itu, berikan izin eksekusi pada skrip:

$ sudo chmod ugo+x /opt/custom/bin/info-session.sh

Sekarang, jalankan:

$ sudo pico /etc/pam.d/common-session

Tambahkan baris ini di akhir file:

# Modified by user:
session optional pam_exec.so /opt/custom/bin/info-session.sh

Tidak perlu memulai kembali layanan apa pun. Perhatikan bahwa skrip ini juga akan dijalankan ketika pengguna masuk dari terminal dan bukan SSH.

Catatan 1: Anda dapat espeakmengirim pipa ke atau proses lain yang sesuai dengan kebutuhan Anda (email, pemberitahuan push, dan sebagainya ...). Jika Anda menggunakan writedan pengguna masuk, ia akan melihat pesan output langsung di terminal mereka.

Referensi:
https://blog.stalkr.net/2010/11/login-notifications-pamexec-scripting.html
https://blog.redbranch.net/2014/06/04/pam_exec-so-execute-commands-on -user-login /

Terkait:
Bagaimana cara saya mengatur peringatan email ketika login ssh berhasil?
/server/400613/how-can-i-configure-my-server-to-notify-me-whenever-it-is-remotely-accessed-via
/server//questions / 395393 / email-notifikasi-tentang-setiap-ssh-koneksi-ke-linux-server

Pestro
sumber