Bagaimana saya bisa menyimpan catatan lokal, timestamped dari semua perintah jarak jauh yang saya gunakan ssh
(klien openssh baris perintah dimulai melalui bash
)?
Persyaratan:
Penting:
- 100% sisi klien tanpa mengandalkan server logging
- Dikonfigurasi atau diinstal per pengguna dengan log yang disimpan di direktori home pengguna.
- Dukungan untuk membedakan antara beberapa sesi simultan dengan berbagai pengguna dan host.
- Non-intrusif (tidak perlu mengaktifkannya setiap kali dan tidak mengganggu penggunaan ssh)
Prioritas utama:
- Entah output tidak dicatat atau disaring sebanyak mungkin
- Entri kata sandi tidak dicatat atau file dienkripsi
- Mengindikasikan perintah aktual yang digunakan (setelah tab / riwayat selesai, backspaces, CTRL+ C, dll ... telah diproses)
Senang bisa memiliki:
- Juga mencatat perintah dalam sesi berantai (perintah yang dimasukkan saat remote
ssh
atausu <user>
sesi) - Awal dan akhir sesi harus dicatat
- Sebuah
bash
solusi sederhana , non-root akan menjadi yang terbaik (mungkin skripalias
ataubash
pembungkus untukssh
perintah?)
- Juga mencatat perintah dalam sesi berantai (perintah yang dimasukkan saat remote
Tingkat keahlian saya:
- Saya bukan orang baru dalam pemrograman, tetapi saya masih belajar
bash
dan "Linux cara", jadi contoh kode dengan penjelasan singkat akan sangat dihargai.
Kemungkinan strategi
- keylogger - Masalah: kata sandi log, tidak mencatat tab / penyelesaian sejarah (lihat jawaban glenn )
screen
dengan scrollback dumping sekali per detik dan didiff
antara mereka untuk menemukan jalur scrollback baru - Masalah: bagaimana ini dapat diterapkan dengan cara otomatis yang bermanfaat?ssh "$@" | tee >(some_cleaner_function >> $logfile)
- Masalah: tidak dapat menangani perintah atau riwayat multiline dalam sesi berantai, pembersihan yang cermat diperlukan (lihat jawaban saya)- Kombinasi beberapa hal di atas
Sebuah contoh
Sesi SSH berikut:
user@local:~$ ssh user@remote
Last login: Tue Jun 17 16:34:23 2014 from local
user@remote:~$ cd test
user@remote:~/test$ ls
a b
user@remote:~/test$ exit
Mungkin menghasilkan log di ~/logs/ssh.log
seperti:
2014-06-17 16:34:50 [user@remote - start]
2014-06-17 16:34:51 [user@remote] cd test
2014-06-17 16:34:52 [user@remote] ls
2014-06-17 16:34:53 [user@remote] exit
2014-06-17 16:34:53 [user@remote - end]
Atau, mungkin log terpisah akan dibuat untuk setiap sesi dengan baris perintah yang digunakan untuk memulai sesi di bagian atas file.
bash
shell
command-line
openssh
Oleg
sumber
sumber
Jawaban:
Saya tertarik dengan pertanyaan Anda. Awalnya saya tidak akan memberikan jawaban tetapi saya ketagihan.
Ini menggunakan
expect
dan itu benar-benar kunci logger.Catatan:
uptime
perintah), Anda akan mendapatkan "upt \ t" dalam file log, bukan "uptime"^?
(karakter backspace) dalam file log.sumber
Saat ini saya menggunakan skrip bash di bawah ini. Ini memiliki banyak masalah, tetapi itu adalah satu-satunya solusi yang saya temukan yang membahas semua persyaratan, prioritas, dan "baik untuk dimiliki" (setidaknya sebagian besar waktu).
Jawaban ini membahas mengapa mencatat sesi ssh secara lokal sangat sulit.
Masalah dengan skrip yang saya temukan sejauh ini:
Perintah multiline menyebabkan masalah:
Sesi berantai (menggunakan
ssh
atausu
perintah pada ujung jarak jauh) menyebabkan riwayat bergulir untuk merekam perintah yang berlalu digulir bukannya perintah yang sebenarnya digunakanEkspresi reguler dapat ditingkatkan dan mungkin perlu dimodifikasi untuk lingkungan tertentu:
cat -v
sebelum membersihkan. Akibatnya, konten yang valid dapat dihapus jika Anda pernah menggunakan string seperti^[[
dalam perintah Anda.Tidak ada penyelesaian perintah ssh bash, seperti untuk nama host.Anda bisa mendapatkan pesta selesai jika Anda alias script ini kessh
denganalias ssh="sshlog"
Sumber dan instalasi skrip:
Untuk menginstal, rekatkan yang berikut ke ~ / bin / sshlog dan buat executable. Panggil dengan
sshlog <ssh command options>
. Secara opsional alias ke 'ssh' di file .bashrc pengguna.Contoh konten log:
sumber
Saya memiliki jawaban yang tidak terlalu rumit, dan tentunya bukan keylogger. Saya tidak mengerti maksud Anda untuk menjadi server log independen (ini berarti bahwa semua tindakan harus diambil ke server dan semua log adalah log sisi server), dan dengan demikian saya pikir ide yang baik adalah meneruskan ke sistem bashrc lebar perintah prompt seperti:
Dalam debian Anda harus mengedit file: /etc/bash.bashrc dan dalam centos file: / etc / bashrc
Jika Anda ingin mulai masuk untuk sesi yang Anda ikuti, Anda harus sumber file yang telah Anda edit, misalnya jalankan:
dalam sistem debian atau
dalam sistem centos.Mulai sekarang, setiap perintah, dari setiap sesi ssh akan dicatat di / var / log / syslog pada sistem debian, dan di / var / log / messages di sistem centos.
Jika Anda ingin mencatatnya pada file terpisah dan tidak mengacaukan dengan file log lain yang dapat Anda gunakan:
bukannya contoh PROMPT_COMMAND sebelumnya dan kemudian konfigurasikan rsyslogd sesuai kebutuhan.Misalnya di Sistem Debian, edit file /etc/rsyslog.conf : ubah baris:
untuk dan tambahkan baris berikut ke akhir file:kemudian jalankan:
sumber
Bagaimana dengan
strace -o /tmp/ssh_log -ff -s8192 -T -ttt -fp $(pidof sshd)
? Ini mencatat semua sesi ssh. Anda mungkin memerlukan alat untuk menguraikan log selanjutnya, atau hanya menggunakangrep
,awk
dll.-f
: melacak anak-anak bercabang dua-ff
: log setiap anak secara terpisah kessh_log.PID
-s8192
: menambah batas logging string (jika perlu)-T -ttt
: stamping mikrodetik dalam hitungan detik sejak Zaman-p N
: lampirkan ke pidN
sumber