Đặt màn hình không đúng khi chạy một công việc crontab gốc liên quan đến GUI


0

Khi chạy tập lệnh bên dưới từ crontab của người dùng cục bộ của tôi, với sudotrước đó /usr/bin/FreeFileSync(dòng của tập lệnh cuối cùng), một cửa sổ tiến trình nhỏ sẽ mở trên GUI của tôi và mọi thứ đều ổn. Điều duy nhất là tôi phải nhập mật mã sudo của mình, điều này làm cho nó tương tác và hơi khó sử dụng.

Quyền root là cần thiết để chạy FFS, nếu không, nó phàn nàn về việc không có quyền truy cập vào một số thư mục và tệp được sao lưu.

  #!/bin/bash
  # define default display and pass it on to any child process
  # from within the running shell
  DISPLAY=:0.0
  export DISPLAY

  /usr/bin/FreeFileSync /home/user/bu-1.ffs_batch 2> \ 
     /home/user/bu-1.ffs_log 

Khi tôi gọi cùng một tập lệnh từ crontab gốc của mình sudo crontab -e, FreeFileSynckhông bao giờ được chạy vì lỗi sau:

$ cat /home/user/bu-1.ffs_log
16:35:01: Error: Unable to initialize GTK+, is DISPLAY set properly?

Có thể thấy, tôi có export DISPLAY=:0.0trong tập lệnh và tập tin crontab gốc của tôi được trang bị:

  $ sudo crontab -e | head -4
  [sudo] password for user:

  1 SHELL=/bin/bash
  2 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  3 HOME=/
  4 MAILTO=root

Ai đó có thể giúp khắc phục lỗi?

EDIT: Có thể việc chạy này từ crontab của root không thành công vì người dùng rootkhông có phiên mở và do đó không có thiết bị xuất hiện nào để hiển thị? Tôi có thể tránh được khó khăn đó bằng cách yêu cầu root hiển thị với thiết bị xuất chuẩn của phiên của người dùng hiện tại không? Nó có vẻ là giá trị một shot nếu có thể làm được; Nếu vậy làm thế nào để tôi làm điều đó?

Câu trả lời:


1

Bạn có thể cấu hình sudođể không cần mật khẩu cho một lệnh cụ thể và quay lại sử dụng một cron không root. Đối với điều này, giả sử id người dùng của "người dùng" muốn chạy lệnh FreeFileSyncdưới dạng root, hãy tạo một tệp /etc/sudoers.d/uservới

user ALL = NOPASSWD: /usr/bin/FreeFileSync

Lệnh phải được cung cấp với một tên đường dẫn đầy đủ. Nếu bạn không liệt kê rõ ràng các đối số vào lệnh, thì mọi đối số sẽ được sudo cho phép. Thay thế ALLbằng tên máy chủ của bạn (không phải localhost) để an toàn hơn.

Giả định tệp /etc/sudoersnày có dòng: (lưu ý # không phải là một nhận xét)

#includedir /etc/sudoers.d

Nếu không, sau đó chỉ cần thêm mục người dùng vào / etc / sudoers. Hãy cẩn thận chỉnh sửa tệp này: sử dụng visudo hoặc đảm bảo bạn đã đăng nhập root hoặc shell chạy root để có thể thực hiện bất kỳ sửa chữa nào.

Mục nhập crontab người dùng của bạn sau đó có thể chỉ cần có lệnh:

DISPLAY=:0.0 sudo /usr/bin/FreeFileSync /home/user/bu-1.ffs_batch 2>/home/user/bu-1.ffs_log

ubfox sudo sẽ bảo tồn một số biến môi trường cho lệnh bao gồm HIỂN THỊ và HOME (xem đầu ra của sudo sudo -V) để chương trình có thể đọc tệp ~ / .Xmasterity (tiếp tục đọc để biết chi tiết).


Ngoài ra, để tiếp tục sử dụng crontab gốc: nếu khi ps alxww|grep Xbạn tìm thấy máy chủ X11 của mình đang chạy với một -authtùy chọn, đại loại như thế này:

/usr/bin/X :0 ... -auth /var/run/lightdm/root/:0 ...

nó có nghĩa là khách hàng phải kết nối bằng cách sử dụng bí mật trong tệp /var/run/lightdm/root/:0. Tệp này giữ một bản sao của bí mật trong ~/.Xauthoritytệp của người dùng . "Bí mật" này chỉ là một số ngẫu nhiên tùy ý. Nếu bạn đã root, bạn có thể đọc cả hai tệp, vì vậy khách hàng của bạn chỉ có thể cung cấp trong môi trường:

XAUTHORITY=/var/run/lightdm/root/:0

Ngoài ra, bạn có thể đặt HOME cho người dùng của màn hình, HOME=/home/userđể .Xauthoritytìm đúng tệp ở đó.

Ngoài ra, bạn có thể xuất bí mật từ nhà này sang nhà của root:

xauth -f /home/user/.Xauthority nextract - localhost/unix:0 | sudo xauth -f /root/.Xauthority nmerge -

và sau đó XAUTHORITY = / root / .Xmasterity hoặc chỉ HOME = / root.


Cảm ơn nhiều @meuh! Tôi sẽ thử điều này ngay bây giờ ... Điều quan trọng là đặt #includedir /etc/sudoers.dở đầu /etc/sudoerstập tin hay tôi có thể đặt nó ở bất cứ đâu trong tập tin đó không?
Cbhihe

Thông thường nó là dòng cuối cùng. Bạn sẽ cần phải tạo thư mục, hãy chắc chắn rằng nó chỉ là rwx để root. Kiểm tra trang người đàn ông sudoers của bạn đầu tiên.
meuh

@Cbhihe Tôi đã thêm một số thông tin về xauth.
meuh

Đang cố gắng tiêu hóa sudoers (5) ngay bây giờ. Trên ps alxww | grep X, bạn có thể muốn viết sudo ps alxw | [...]kẻ theo dõi kẻo có thể bị nhầm lẫn với một personalityvấn đề. Ngoài ra, bạn có nghĩa là để lặp lại tùy chọn w (đầu ra rộng) trong psmột số lý do?
Cbhihe

Tôi có nên cho rằng dòng của bạn user ALL = NOPASSWD: /usr/bin/FreeFileSync đã được vệ sinh vì mục đích chung và thực tế tôi có nên tạo một tệp /etc/sudoers.d/không được gọi là "người dùng" mà là một số tên người dùng hiện có không? Tôi cũng nên giả sử rằng trên cùng một dòng nên đọc: real-username real-hostname = NOPASSWD: /usr/bin/FreeFileSyncMột ví dụ trong sudoers (5) manpage gợi ý như vậy. Tx.
Cbhihe
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.