Cách tự động ghi lại tất cả các phiên cuối của bạn với tiện ích tập lệnh


28

Những gì tôi muốn đạt được là có thể ghi lại các phiên cuối của mình để tự động gửi bất cứ khi nào tôi sử dụng Yakuake / Konsole.

Thật dễ dàng để đạt được nếu khi bắt đầu phiên tôi làm:

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

Nhưng tôi muốn chạy tự động ở trên bất cứ khi nào tôi khởi động Yakuake hoặc mở một tab mới.

Sử dụng .bashrc không hoạt động vì nó tạo ra vòng lặp vô tận khi 'script' mở một phiên mới, lần lượt đọc .bashrc và bắt đầu một 'script' khác, v.v.

Vì vậy, có lẽ tôi cần phải viết kịch bản Yakuake / Konsole bằng cách nào đó để chạy 'script' một lần khi một tab mới được mở. Câu hỏi là thế nào?


thử giải pháp có vấn đề với bài toán vòng lặp, nhưng hãy chuẩn bị trước execkhi bắt đầu dòng. nó sẽ bắt đầu script -ftrong cùng một lớp vỏ PID.
Hanan N.

Một phiên bản thú vị khác của câu hỏi này là làm thế nào để buộc người dùng không có bánh xe phải viết kịch bản tất cả các phiên của họ ...
Yordan Georgiev

Câu trả lời:


26

Nếu ai đó muốn tự động ghi lại các phiên cuối của họ - bao gồm các phiên SSH (!) - bằng cách sử dụng scripttiện ích, đây là cách thực hiện.

Thêm dòng sau vào cuối thư mục chính của .bashrcbạn hoặc nếu không /etc/bash.bashrcbạn chỉ muốn ghi lại tất cả các phiên của người dùng. Chúng tôi kiểm tra quá trình cha mẹ của shell không được scriptvà sau đó chạy script.

Đối với Linux:

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

Đối với BSD và macOS, thay đổi script -fthành script -F:

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

Đó là tất cả!

Bây giờ khi bạn mở một thiết bị đầu cuối mới, bạn sẽ thấy:

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

scriptsẽ viết các phiên của bạn vào một tệp trong thư mục nhà của bạn đặt tên cho chúng giống 30-Nov-11_00-11-12_shell.lognhư kết quả.

Thêm tùy chỉnh:

  • Bạn có thể nối các phiên của mình vào một tệp lớn thay vì tạo một tệp mới cho mỗi phiên với script -a /path/to/single_log_file
  • Bạn có thể điều chỉnh vị trí các tệp được ghi bằng cách thay đổi đường dẫn sau script -f(Linux) hoặc script -F(BSD và macOS)

Câu trả lời này giả định rằng bạn đã scriptcài đặt, tất nhiên. Trên các bản phân phối dựa trên Debian, scriptlà một phần của bsdutilsgói.


Bạn có thể tự chỉnh sửa câu hỏi và tiêu đề của nó. Chỉ cần nhấp vào editnút xuất hiện ngay bên dưới nó.
Mat

8
Bạn có thể muốn xem xét việc thêm một ${RANDOM}và / hoặc $$vào tên tệp vì việc bắt đầu hai shell trong vòng một giây sẽ gây ra xung đột tên tệp. Cá nhân, tôi thường sử dụng script.$(date -u +%Y%m%dt%H%M%S).${HOSTNAME:-$(hostname)}.$$.${RANDOM}.logđể đảm bảo các tệp được tự động sắp xếp theo ngày / giờ và chúng nhất quán trên TZ, tôi biết máy chủ đã khởi tạo nó, tôi biết quá trình sở hữu và không có xung đột tên. Tôi hiếm khi sử dụng ${USER}bởi vì nó thường chỉ dành cho tôi.
nicerobot

"Hãy chắc chắn rằng bạn thực sự đã tạo / var / log / script và làm cho nó có thể ghi được bởi những người khác", bạn đã viết. Tôi đã tự hỏi nếu nó được khuyến khích từ quan điểm bảo mật để sử dụng "sudo chmod 777 / var / log / script" trong trường hợp này.
Teo

10

Mặc dù câu hỏi này được hỏi bởi một cá nhân muốn ghi lại các phiên của riêng mình, trường hợp sử dụng thay thế có thể là quản trị viên hệ thống muốn theo dõi những gì người dùng đang làm.

Tôi sợ chạy scriptbên trong toàn hệ thống bashrccó thể không phù hợp trong trường hợp khi người dùng máy không muốn có các bản ghi được tạo từ các phiên của họ.

Người dùng muốn ẩn danh có thể bỏ qua việc đăng nhập bằng cách yêu cầu sshd mở một trình bao khác (ví dụ zsh) hoặc chạy bash --rcfile ___để ngăn /etc/bash.bashrckhông cho tải.

Một cách tiếp cận khác

Hướng dẫn này từ năm 2008 ( được lưu trữ ) sử dụng một phương pháp khác để bắt buộc scriptphải chạy khi người dùng đăng nhập bằng ssh, yêu cầu người dùng đăng nhập bằng khóa chung / riêng.

Điều này được thực hiện bằng cách thêm tập lệnh vào .ssh/authorized_keystệp của người dùng , trước phím:

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

Tập lệnh log-session( được lưu trữ ) sau đó quyết định có chạy hay không /usr/bin/scriptđể ghi nhật ký phiên của người dùng này.

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

Để ngăn người dùng xóa lệnh đã thêm, quản trị viên sẽ cần có quyền sở hữu authorized_keystệp của người dùng .

chown root:root ~user/.ssh/authorized_keys

Thật không may, điều này có nghĩa là người dùng sẽ không thể thêm bất kỳ khóa bổ sung nào, hoặc quan trọng hơn là thu hồi khóa hiện tại nếu nó bị xâm phạm, điều này không còn lý tưởng.

Hãy cẩn thận

Cấu hình mặc định của sshd là phổ biến để cho phép người dùng thực hiện SFTP qua đăng nhập ssh của họ. Điều này cung cấp một cách để người dùng chỉnh sửa các tập tin mà không cần thay đổi. Nếu quản trị viên không muốn người dùng có thể làm điều đó, thì anh ta nên kích hoạt một số ghi nhật ký cho SFTP hoặc vô hiệu hóa dịch vụ. Mặc dù sau đó, người dùng vẫn có thể thực hiện các thay đổi chưa thấy đối với các tệp bằng cách chạy một cái gì đó như thế này trong thiết bị đầu cuối của họ:

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

Có thể theo dõi các thay đổi như vậy bằng cách sử dụng hệ thống tệp sao chép khi ghi, ghi lại tất cả lịch sử tệp.

Nhưng một mẹo tương tự sẽ cho phép người dùng thực thi các lệnh mà không cần ghi nhật ký:

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

Tôi không biết bất kỳ giải pháp dễ dàng cho điều đó. Khả năng có thể là:

  • Ghi nhật ký tất cả dữ liệu mạng (và gỡ rối nó sau).
  • Ghi nhật ký tất cả các cuộc gọi hệ thống.

Loại điều này có thể có thể với audd .

Nhưng dù sao...

Không chắc là các phiên người dùng đăng nhập cung cấp bất kỳ bảo mật thực sự cho quản trị viên. Theo mặc định, người dùng chỉ có thể thao tác các tệp của riêng họ và không thể làm hại hệ thống. Nếu người dùng độc hại đã quản lý để leo thang đặc quyền, thì anh ta có thể vô hiệu hóa ghi nhật ký và xóa nhật ký (trừ khi quản trị viên đã định cấu hình nhật ký được lưu trữ trên một máy riêng biệt, theo kiểu chỉ có phụ lục).

Quản trị viên tự động đăng nhập phiên người dùng có thể nên thông báo cho người dùng rằng việc này đang được thực hiện . Trong một số khu vực pháp lý, hình thức thu thập dữ liệu này có thể vi phạm luật dữ liệu hoặc quyền riêng tư . Và ít nhất, sẽ rất tôn trọng người dùng để họ biết.

Nhiều khả năng là một quản trị viên sẽ quan tâm đến việc đăng nhập các phiên của sudongười dùng. Điều đó có lẽ có thể được giải quyết trong một câu trả lời khác, hoặc thực sự là một câu hỏi khác.


2

Thay vì:

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

Tôi sẽ dùng:

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

Dấu ngoặc kép không cần thiết trong trường hợp này, nhưng tôi có xu hướng sử dụng chúng như một cách thực hành tiêu chuẩn. Tôi chắc chắn khuyên bạn nên sử dụng công tắc "x" cho cả grep và pgrep, để tránh sự trùng khớp hiếm gặp nhưng có vấn đề với các chuỗi con.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.