Cara merekam semua sesi terminal Anda secara otomatis dengan utilitas skrip

28

Apa yang ingin saya capai adalah dapat merekam sesi terminal saya untuk file secara otomatis setiap kali saya menggunakan Yakuake / Konsole.

Sangat mudah untuk dicapai jika pada awal sesi saya saya lakukan:

script -f /home/$USER/bin/shell_logs/$(date +"%d-%b-%y_%H-%M-%S")_shell.log

Tapi saya ingin menjalankan di atas secara otomatis setiap kali saya memulai Yakuake atau membuka tab baru.

Menggunakan .bashrc tidak berfungsi karena ia membuat loop tanpa akhir ketika 'script' membuka sesi baru, yang pada gilirannya membaca .bashrc dan memulai 'script' lainnya dan seterusnya.

Jadi mungkin saya perlu membuat skrip Yakuake / Konsole untuk menjalankan 'skrip' satu kali saat tab baru dibuka. Pertanyaannya adalah bagaimana?

Stan
sumber
coba solusi yang bermasalah dengan masalah loop, tetapi tambahkan execdi awal baris. itu harus memulai script -fdi PID shell yang sama.
Hanan N.
Yang juga menarik versi pertapaan dari pertanyaan ini adalah bagaimana cara memaksa sebagai root pengguna non-roda untuk skrip semua sesi mereka juga ...
Yordan Georgiev

Jawaban:

26

Jika seseorang ingin merekam sesi terminal mereka secara otomatis - termasuk sesi SSH (!) - menggunakan scriptutilitas, berikut adalah caranya.

Tambahkan baris berikut di akhir .bashrcdirektori home Anda, atau /etc/bash.bashrcjika Anda hanya ingin merekam semua sesi pengguna. Kami menguji proses induk shell tidak sedang scriptdan kemudian berjalan script.

Untuk Linux:

test "$(ps -ocommand= -p $PPID | awk '{print $1}')" == 'script' || (script -f $HOME/$(date +"%d-%b-%y_%H-%M-%S")_shell.log)

Untuk BSD dan macOS, ubah script -fke script -F:

test "$(ps -ocommand= -p $PPID | awk '{print $1}')" == 'script' || (script -F $HOME/$(date +"%d-%b-%y_%H-%M-%S")_shell.log)

Itu saja!

Sekarang ketika Anda membuka terminal baru Anda akan melihat:

Script started, file is /home/username/file_name.log

scriptakan menulis sesi Anda ke file di direktori home Anda menamakannya sesuatu 30-Nov-11_00-11-12_shell.logsebagai hasilnya.

Lebih banyak penyesuaian:

  • Anda dapat menambahkan sesi Anda ke satu file besar daripada membuat yang baru untuk setiap sesi dengan script -a /path/to/single_log_file
  • Anda dapat menyesuaikan di mana file ditulis dengan mengubah path setelah script -f(Linux) atau script -F(BSD dan macOS)

Jawaban ini mengasumsikan bahwa Anda telah scriptmenginstal, tentu saja. Pada distribusi berbasis Debian, scriptadalah bagian dari bsdutilspaket.

Stan
sumber
Anda dapat mengedit sendiri pertanyaan dan judulnya. Cukup klik pada edittombol yang muncul tepat di bawahnya.
Mat
8
Anda mungkin ingin mempertimbangkan untuk menambahkan ${RANDOM}dan / atau $$nama file karena memulai dua shell dalam satu detik satu sama lain akan menyebabkan tabrakan nama file. Secara pribadi, saya sering menggunakan script.$(date -u +%Y%m%dt%H%M%S).${HOSTNAME:-$(hostname)}.$$.${RANDOM}.loguntuk memastikan file secara otomatis diurutkan berdasarkan tanggal / waktu dan mereka konsisten dengan TZ, saya tahu host yang memprakarsai itu, saya tahu proses kepemilikan, dan tidak ada tabrakan nama. Saya jarang menggunakannya ${USER}karena biasanya hanya untuk saya.
nicerobot
"pastikan Anda benar-benar membuat / var / log / script dan membuatnya dapat ditulis oleh orang lain" tulis Anda. Saya bertanya-tanya apakah disarankan dari perspektif keamanan untuk menggunakan "sudo chmod 777 / var / log / script" dalam kasus ini.
Teo
10

Meskipun pertanyaan ini diajukan oleh seorang individu yang ingin merekam sesi sendiri, kasus penggunaan alternatif mungkin adalah administrator sistem yang ingin melacak apa yang dilakukan berbagai pengguna.

Saya khawatir menjalankan scriptdi dalam sistem bashrcmungkin tidak cocok jika pengguna mesin enggan untuk membuat rekaman sesi mereka.

Pengguna yang ingin tetap penyamaran dapat mem-bypass logging dengan meminta sshd untuk membuka shell yang berbeda (mis. zsh) Atau menjalankan bash --rcfile ___untuk mencegah /etc/bash.bashrcagar tidak dimuat.

Pendekatan alternatif

Panduan ini dari 2008 ( diarsipkan ) menggunakan metode berbeda untuk memaksa scriptdijalankan ketika pengguna masuk dengan ssh, yang mengharuskan pengguna untuk masuk dengan kunci publik / pribadi.

Ini dilakukan dengan menambahkan skrip ke file pengguna .ssh/authorized_keys, di depan kunci:

command="/usr/local/sbin/log-session" ssh-dss AAAAB3NzaC1kc3MAAAEBAMKr1HxJz.....

The log-session( diarsipkan ) Script kemudian memutuskan apakah atau tidak untuk menjalankan /usr/bin/scriptlog sesi pengguna ini.

exec script -a -f -q -c "$SSH_ORIGINAL_COMMAND" $LOGFILE

Untuk mencegah pengguna menghapus perintah yang ditambahkan, administrator perlu mengasumsikan kepemilikan authorized_keysfile pengguna .

chown root:root ~user/.ssh/authorized_keys

Sayangnya, ini berarti pengguna tidak dapat menambahkan kunci tambahan sendiri, atau yang lebih penting mencabut kunci yang ada jika dikompromikan, yang jauh dari ideal.

Peringatan

Biasanya konfigurasi default sshd memungkinkan pengguna untuk melakukan SFTP melalui login ssh mereka. Ini menawarkan cara bagi pengguna untuk mengedit file tanpa perubahan yang dicatat. Jika administrator tidak ingin pengguna dapat melakukan itu, maka ia harus mengaktifkan beberapa pencatatan untuk SFTP, atau menonaktifkan layanan. Meskipun demikian, pengguna masih dapat membuat perubahan yang tidak terlihat pada file dengan menjalankan sesuatu seperti ini di terminal mereka:

curl "http://users.own.server/server/new_data" > existing_file

Dimungkinkan untuk memantau perubahan seperti itu dengan menggunakan sistem file copy-on-write yang mencatat semua riwayat file.

Tetapi trik serupa akan memungkinkan pengguna untuk menjalankan perintah tanpa harus dicatat:

curl "http://users.own.server/server/secret_commands_824" | sh

Saya tidak tahu solusi mudah untuk itu. Kemungkinannya mungkin:

  • Log semua data jaringan (dan uraikan nanti).
  • Log semua panggilan sistem.

Hal semacam ini dimungkinkan dengan auditd .

Tapi bagaimanapun juga ...

Tidak mungkin bahwa sesi pengguna logging menyediakan keamanan nyata untuk administrator. Secara default, pengguna hanya dapat memanipulasi file mereka sendiri, dan tidak dapat membahayakan sistem. Jika pengguna jahat berhasil meningkatkan hak istimewa, maka ia dapat menonaktifkan pencatatan dan penghapusan log (kecuali jika administrator telah mengonfigurasi log untuk disimpan di mesin yang terpisah, dengan cara tambahan saja).

Administrator yang secara otomatis mencatat sesi pengguna mungkin harus memberi tahu pengguna bahwa ini sedang dilakukan . Di beberapa yurisdiksi, bentuk pengumpulan data ini mungkin melanggar undang-undang data atau privasi . Dan paling tidak, akan menghormati pengguna untuk membuat mereka sadar.

Kemungkinan besar administrator akan tertarik untuk mencatat sesi sudopengguna. Itu mungkin bisa ditangani dalam jawaban yang berbeda, atau memang pertanyaan yang berbeda.

joeytwiddle
sumber
2

Dari pada:

test "$(ps -ocommand= -p $PPID | awk '{print $1}')" == 'script' ||

Saya akan menggunakan:

grep -qx "$PPID" <(pgrep -x "script") ||

Kutipan ganda tidak diperlukan dalam kasus ini, tetapi saya cenderung menggunakannya sebagai praktik standar. Saya merekomendasikan penggunaan "x" untuk grep dan pgrep, untuk menghindari kecocokan yang jarang namun bermasalah dengan substring.

William Dye
sumber