Tüm terminal oturumlarınızı script programı ile otomatik olarak nasıl kaydedersiniz?


28

Ulaşmak istediğim, Yakuake / Konsole kullandığımda terminal oturumlarımı otomatik olarak dosyaya kaydedebilmektir.

Oturumumun başında yaparsam elde etmek kolaydır:

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

Ancak Yakuake'i her başlattığımda veya yeni bir sekme açtığımda yukarıdakileri otomatik olarak çalıştırmak istiyorum.

.Bashrc kullanmak, 'script', .bashrc okuyan ve başka bir 'script' başlatan yeni bir oturum açar.

Muhtemelen yeni bir sekme açıldığında 'script' komutunu çalıştırmak için bir şekilde Yakuake / Konsole yazmam gerekiyor. Soru nasıl?


problemli çözümü loop problemi ile deneyin, fakat exechattın başlangıcını hazırlayın . script -faynı kabuk PID'de başlamalıdır .
Hanan N.

Ayrıca, bu sorgunun ilginç ve ilginç bir versiyonu da, tekerleği olmayan kullanıcıları tüm oturumlarını da yazmaya zorlamaktır.
Yordan Georgiev

Yanıtlar:


26

Birisi uçbirim oturumlarını otomatik olarak kaydetmek istiyorsa - SSH oturumları (!) Dahil - scriptyardımcı programı kullanarak , işte böyle.

Aşağıdaki .bashrcdizini ana dizininizin sonuna veya /etc/bash.bashrcyalnızca tüm kullanıcıların oturumlarını kaydetmek istiyorsanız ekleyin . Shell'in ebeveyn sürecinin olmayışını test ettik scriptve sonra çalıştırdık script.

Linux için:

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

BSD ve MacOS için değişiklik script -fiçin script -F:

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

Bu kadar!

Şimdi yeni bir terminal açtığınızda göreceksiniz:

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

scriptoturumlarınızı ana dizininizdeki bir dosyaya yazar ve 30-Nov-11_00-11-12_shell.logsonuç olarak bunları benzer bir şekilde adlandırır .

Daha fazla özelleştirme:

  • Her oturum için yeni bir tane oluşturmak yerine, oturumlarınızı büyük bir dosyaya ekleyebilirsiniz. script -a /path/to/single_log_file
  • script -f(Linux) veya script -F(BSD ve macOS) sonrası yolu değiştirerek dosyaların nereye yazılacağını ayarlayabilirsiniz.

Bu cevap scriptelbette kurduğunuzu varsaymaktadır . Debian tabanlı dağıtımlarda paketin bir scriptparçası bsdutils.


Sorunuzu ve başlığını kendiniz düzenleyebilirsiniz. Hemen editaltında görünen butona tıklamanız yeterli .
Mat

8
Dosya adına bir ${RANDOM}ve / veya eklemeyi düşünebilirsiniz $$, çünkü bir saniye içinde iki mermi başlatmak bir dosya adı çarpışmasına neden olur. Şahsen, script.$(date -u +%Y%m%dt%H%M%S).${HOSTNAME:-$(hostname)}.$$.${RANDOM}.logdosyaların otomatik olarak tarih / saate göre sıralandığından ve TZ'de tutarlı olduklarından emin olmak için sıklıkla kullanıyorum , onu başlatan ana bilgisayarı biliyorum, sahip olma işlemini biliyorum ve isim çakışması yok. Nadiren kullanıyorum ${USER}çünkü bu sadece benim için bir şey.
nicerobot

"/ var / log / script yazdığınızdan ve başkaları tarafından yazılabilir olduğundan emin olun" yazdı. Bu durumda güvenlik açısından "sudo chmod 777 / var / log / script" kullanmanın uygun olup olmadığını merak ediyordum.
Teo

10

Bu soruyu kendi oturumlarını kaydetmek isteyen bir kişi tarafından sorulmasına rağmen, alternatif bir kullanım durumu, çeşitli kullanıcıların ne yaptığını takip etmek isteyen bir sistem yöneticisi olabilir.

Makinenin kullanıcılarının oturumlarından kayıt yapmakta isteksiz oldukları durumlarda script, sistem genelinde koşmanın bashrcuygun olmayacağından korkuyorum .

Gizli kalmak isteyen kullanıcılar sshd'den farklı bir kabuk (örn. zsh) Açmasını veya yüklenmesini bash --rcfile ___önlemek için koşmasını isteyerek günlüğü atlayabilir /etc/bash.bashrc.

Alternatif bir yaklaşım

2008'deki ( arşivlenmiş ) bu kılavuz, bir kullanıcı ssh ile oturum açtığında çalıştırılmasını zorlamak için farklı bir yöntem kullanır script; bu, kullanıcıların bir genel / özel anahtarla oturum açmasını gerektirir.

Bu, .ssh/authorized_keysanahtarın önünde , kullanıcının dosyasına bir komut dosyası ekleyerek yapılır.

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

log-session( Arşivlenmiş ) Daha sonra komut dosyası çalıştırmak için karar verir /usr/bin/scriptkullanıcının oturumunu oturum açmak için.

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

Kullanıcının eklenen komutu kaldırmasını önlemek için, yöneticinin kullanıcının authorized_keysdosyasının sahipliğini üstlenmesi gerekir .

chown root:root ~user/.ssh/authorized_keys

Ne yazık ki, bu, kullanıcının kendisine herhangi bir ek anahtar ekleyemeyeceği veya ideal olandan uzak olan bir güvenlik sorunu varsa mevcut anahtarı iptal edemeyeceği anlamına gelir.

Uyarılar

Kullanıcıların ssh oturum açma sırasında SFTP gerçekleştirmelerine izin vermek için sshd'nin varsayılan yapılandırması yaygındır. Bu, kullanıcıların değişiklikler kaydedilmeden dosyaları düzenlemelerini sağlar. Yönetici kullanıcıların bunu yapmasını istemiyorsa, SFTP için bazı günlük kaydını etkinleştirmeli veya hizmeti devre dışı bırakmalıdır. Yine de kullanıcılar terminallerinde böyle bir şey çalıştırarak dosyalarda görünmeyen değişiklikler yapabilirler:

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

Tüm dosya geçmişini kaydeden bir yazma üzerine dosya sistemi kullanarak bu değişiklikleri izlemeniz mümkün olabilir.

Ancak benzer bir numara, kullanıcının komutları oturum açmadan yürütmesine izin verir:

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

Bunun kolay bir çözümü olduğunu bilmiyorum. Olasılıklar olabilir:

  • Tüm ağ verilerini günlüğe kaydetme (ve daha sonra çözme).
  • Tüm sistem çağrılarını günlüğe kaydetme.

Bu tür şeyler auditd ile mümkün olabilir .

Ama yine de ...

Kullanıcı oturumlarının günlüğe kaydedilmesinin yöneticiler için gerçek bir güvenlik sağlaması olası değildir. Varsayılan olarak bir kullanıcı yalnızca kendi dosyalarını değiştirebilir ve sisteme zarar veremez. Kötü niyetli bir kullanıcı ayrıcalıkları yükseltmeyi başardıysa, günlüğü devre dışı bırakabilir ve günlükleri silebilir (yönetici günlükleri yalnızca ek bir şekilde ayrı bir makinede depolanacak şekilde yapılandırmadıysa).

Kullanıcı oturumlarını otomatik olarak kaydeden yöneticiler muhtemelen kullanıcılara bunun yapıldığını bildirmelidir . Bazı yargı bölgelerinde, bu veri toplama biçimi veri veya gizlilik yasalarını ihlal edebilir . Ve en azından, kullanıcıların farkında olmaları için saygılı olur.

Bir yöneticinin, sudokullanıcıların oturumlarını günlüğe kaydetmeyle ilgilenmesi daha olasıdır . Bu belki de farklı bir cevapta ya da gerçekten de farklı bir soruda ele alınabilir.


2

Yerine:

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

Kullanmak istiyorum:

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

İkili tırnak bu durumda gerekli değildir, ancak bunları yine de standart bir uygulama olarak kullanma eğilimindeyim. Substratlarla nadir fakat sorunlu bir eşleşmeyi önlemek için grep ve pgrep için "x" anahtarını kullanmanızı kesinlikle tavsiye ederim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.