UDEV bằng cách nào đó có thể kích hoạt sự thoải mái cho người dùng đã đăng nhập trong một phiên không?


0

Tôi muốn một zenityhộp thoại bật lên hỏi tôi có muốn chạy bản sao lưu không, khi tôi gắn một ổ đĩa ngoài cụ thể.

Thật không may, tôi gặp rắc rối với cú pháp quy tắc UDEV. Tôi đã có quy tắc này trong /etc/udev/rules.d/test.rules:

ACTION=="add", ATTRS{manufacturer}=="Western Digital", ATTRS{idVendor}=="1058", ATTRS{idProduct}=="1140", RUN+="/usr/local/bin/test.sh"

Nó khá cơ bản, nhưng:

  1. Nó được kích hoạt hàng chục lần thay vì một lần.
  2. Nó không thể 'nói chuyện' bằng zenitykhi test.shđi sudo -Hu <username> zenity --warning --text="Just some random text for now."vì udev được giấu đi trong hệ thống và không thể tìm thấy người quản lý cửa sổ: Gtk-CẢNH BÁO **: có thể hiển thị không mở:
  3. Nó không thân thiện với chỉnh sửa, tôi ước có một số quy tắc mà tôi có thể chỉ cần gõ LABEL cho các phân vùng nhất định mà tôi muốn kích hoạt một số tập lệnh nhất định.

Tôi muốn thấy một cải tiến chung cho quy tắc UDEV, bởi vì ngoài nhiều câu hỏi và câu trả lời về nó, ở đây và ở nơi khác, tất cả chúng có vẻ hơi khác nhau và hầu hết chúng đều kích hoạt nhiều lần.

Nhưng quan trọng nhất là, bằng cách nào, tôi có thể tạo kết nối từ đây đến một tập lệnh trong nhà có quyền truy cập vào các nội dung như phiên và màn hình của tôi để zenitycó thể hoạt động không?

Câu trả lời:


0

Bạn đã tìm thấy câu trả lời. Kịch bản (zenity) cần X Window Server để hiển thị thông báo. Kịch bản được chạy từ udevvà không có màn hình kèm theo. Bạn có thể giải quyết điều này bằng cách làm cứng DISPLAYbiến trong tập lệnh của mình, tức là

DISPLAY=:0; export DISPLAY

Hạn chế của điều này là, nó chỉ hoạt động, nếu bạn là người dùng duy nhất và / hoặc biết trước màn hình. Nếu có nhiều người dùng trên hệ thống của bạn, ví dụ :1, màn hình có thể là bất cứ thứ gì khác, :2v.v. Hoặc một người dùng khác nhận được thông báo tiện nghi trên màn hình của anh ta.

Một cách tiếp cận tốt hơn sẽ là phân chia phát hiện sự kiện và sự tương tác với người dùng hoặc hiển thị thông báo.

Để làm điều này, bạn có thể tạo một tập lệnh hoặc chương trình chạy trong phiên GUI của bạn và lắng nghe trình kích hoạt từ trình nền hoặc tập lệnh kích hoạt udev.

Khả năng thứ ba có thể là kết nối với udisks-daemonvà hỏi thông tin, khi thiết bị bên ngoài được cắm. Bạn có thể thử udisks --monitorhoặc udisks --monitor-detailcho điều này và phân tích đầu ra, bất cứ khi nào sự kiện xảy ra.

Dường như có một udisksctllệnh, thực hiện tương tự với một cú pháp hơi khác nhau. Có lẽ nó chỉ là một phiên bản mới hơn của udiskslệnh.

Bạn cũng có thể xem một số công cụ Gui như Đĩa Gnome , cũng dựa trên hệ thống udev / udisks.

Cập nhật :

Nhiều yêu cầu thường phát sinh từ báo cáo của các hệ thống con khác nhau. Bạn có thể thấy rằng, khi bạn đăng nhập môi trường vào một số tệp nhật ký trong /usr/local/bin/test.shtập lệnh

umask 077
mkdir -p /tmp/udevtest.d
env >>/tmp/udevtest.d/udevtest.log

Khi tôi cắm thẻ USB, tôi nhận được các báo cáo sau

$ grep -e ACTION -e SUBSYSTEM /tmp/udevtest.d/udevtest.log
ACTION=add
SUBSYSTEM=usb
ACTION=add
SUBSYSTEM=usb
ACTION=add
SUBSYSTEM=scsi
ACTION=add
SUBSYSTEM=scsi_host
ACTION=add
SUBSYSTEM=scsi
ACTION=add
SUBSYSTEM=scsi
ACTION=add
SUBSYSTEM=scsi_disk
ACTION=add
SUBSYSTEM=scsi_generic
ACTION=add
SUBSYSTEM=scsi_device
ACTION=add
SUBSYSTEM=bsg
ACTION=add
SUBSYSTEM=block
ACTION=add
SUBSYSTEM=block

Bạn cũng có thể thêm DEVTYPEđể phân biệt giữa hai usbhoặc diskbáo cáo. Vì vậy, để giảm các báo cáo xuống chỉ một vài hoặc thậm chí chỉ một cuộc gọi, bạn phải cụ thể hơn và thêm các điều kiện bổ sung vào tệp quy tắc udev của bạn, ví dụ chọn SUBSYSTEM=scsi_diskhoặc bất cứ điều gì phù hợp cho thiết bị của bạn.


Cảm ơn bạn đã phản hồi và đề cập đến các lựa chọn thay thế. Bạn đã đúng, DISPLAY=:0đã lừa Câu trả lời này giải quyết vấn đề phụ 2, nhưng như câu hỏi phụ 1 dự đoán, bây giờ tôi nhận được zenitycửa sổ bật lên của mình khoảng 30 lần cho 1 lần cắm vào ổ đĩa. Bất cứ ý tưởng làm thế nào tôi có thể giảm điều này? Tốt nhất là tôi muốn tập lệnh được gọi chỉ với tên phân vùng làm đối số. (Ví dụ kịch bản được gọi là 3 lần với 3 phân vùng.) Tôi cũng đã cố gắng udisksvì nó có vẻ dễ dàng như vậy, nhưng nó chỉ ngồi đó tự xưng là giám sát, nhưng không báo cáo bất cứ điều gì tôi cắm vào. Có lẽ nó không được thực hiện một cách chính xác cho Ubuntu.
Redsandro

Ah udiskctlkhông theo dõi các sự kiện. Tôi sẽ xem xét kỹ hơn nếu tôi không thể tìm ra cách thực hiện theo các udevquy tắc như dự kiến ​​ban đầu.
Redsandro

@Redsandro Xin vui lòng xem câu trả lời cập nhật.
Olaf Dietsche

Cảm ơn bạn. Nó vẫn là một câu đố, nhưng bây giờ tôi được thông báo tốt hơn. Tôi đã chấp nhận câu trả lời của bạn.
Redsandro

0

Đối với bất kỳ ai khác đọc điều này, cách duy nhất tôi có thể khiến tập lệnh của mình trong Kali Linux 2016 hoạt động, là như thế này:

#!/bin/bash
set -x
xhost local:root
export DISPLAY=:0.0
su root -c 'zenity --notification --text="I am a notification!"'
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.