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?
exec
di awal baris. itu harus memulaiscript -f
di PID shell yang sama.Jawaban:
Jika seseorang ingin merekam sesi terminal mereka secara otomatis - termasuk sesi SSH (!) - menggunakan
script
utilitas, berikut adalah caranya.Tambahkan baris berikut di akhir
.bashrc
direktori home Anda, atau/etc/bash.bashrc
jika Anda hanya ingin merekam semua sesi pengguna. Kami menguji proses induk shell tidak sedangscript
dan kemudian berjalanscript
.Untuk Linux:
Untuk BSD dan macOS, ubah
script -f
kescript -F
:Itu saja!
Sekarang ketika Anda membuka terminal baru Anda akan melihat:
script
akan menulis sesi Anda ke file di direktori home Anda menamakannya sesuatu30-Nov-11_00-11-12_shell.log
sebagai hasilnya.Lebih banyak penyesuaian:
script -a /path/to/single_log_file
script -f
(Linux) atauscript -F
(BSD dan macOS)Jawaban ini mengasumsikan bahwa Anda telah
script
menginstal, tentu saja. Pada distribusi berbasis Debian,script
adalah bagian daribsdutils
paket.sumber
edit
tombol yang muncul tepat di bawahnya.${RANDOM}
dan / atau$$
nama file karena memulai dua shell dalam satu detik satu sama lain akan menyebabkan tabrakan nama file. Secara pribadi, saya sering menggunakanscript.$(date -u +%Y%m%dt%H%M%S).${HOSTNAME:-$(hostname)}.$$.${RANDOM}.log
untuk 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.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.
Pendekatan alternatif
Panduan ini dari 2008 ( diarsipkan ) menggunakan metode berbeda untuk memaksa
script
dijalankan 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:The
log-session
( diarsipkan ) Script kemudian memutuskan apakah atau tidak untuk menjalankan/usr/bin/script
log sesi pengguna ini.Untuk mencegah pengguna menghapus perintah yang ditambahkan, administrator perlu mengasumsikan kepemilikan
authorized_keys
file pengguna .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:
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:
Saya tidak tahu solusi mudah untuk itu. Kemungkinannya mungkin:
Hal semacam ini dimungkinkan dengan auditd .
Tapi bagaimanapun juga ...
sumber
Dari pada:
Saya akan menggunakan:
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.
sumber