Làm cách nào để gửi một `xmessage` với quyền root từ xa cho người dùng thông thường đăng nhập bằng phiên 'x'?


5

Tôi đang sử dụng BASH trên dòng lệnh, đăng nhập vào PC của người dùng khác bằng root, thông qua SSH.

Tôi muốn gửi cho người dùng hiện đang đăng nhập để chạy phiên X, tin nhắn bật lên, nhưng đây là kết quả:

root@i5:~$ xmessage now                           
Invalid MIT-MAGIC-COOKIE-1 keyInvalid MIT-MAGIC-COOKIE-1 keyError: Can't open display: :0  

Kết quả dự kiến ​​là một thông báo bật lên trên máy từ xa, nói "ngay bây giờ".

Tôi có thể sao chép nó trên máy cục bộ của mình bằng cách bắt đầu một phiên x cục bộ, sau đó trong một thiết bị đầu cuối nếu tôi gõ xmessage nownó hoạt động, nhưng nếu trong thiết bị đầu cuối tôi su-vì vậy tôi đã root và tôi thử lại, tôi gặp lỗi tương tự như trên.

Tôi cũng muốn sử dụng tập lệnh này trong tập lệnh cần được chạy bằng root bằng cron, trên máy cục bộ của tôi và tập lệnh trong một số trường hợp nhất định, sẽ cảnh báo tôi và yêu cầu tôi chọn một trong hai nút đưa ra phản hồi cho tập lệnh.


Trước tiên, hãy thử "echo $ HIỂN THỊ" (hoặc "ai" thông thường để xem màn hình nào sẽ xuất ra, sau đó sử dụng xmessage với tham số -display.

Cảm ơn Andy. Tôi đã kiểm tra lại trang man cho xmessage và dường như không thể tìm thấy bất kỳ đề cập nào về -displaytham số hoặc cú pháp của nó.
Peter Snow

Kiểm tra xem $ DISPLAY đã được đặt (tin rằng nó cần phải có) và sử dụng "echo $ DISPLAY" hoặc "who" để xem số hiển thị, sau đó chạy xmessage với -display: 0.0 (hoặc tương tự) và nếu thất bại, hãy kiểm tra trên màn hình truy cập bằng xhost / xauth.

Câu trả lời:


2

Mở cửa sổ bật lên trên phiên máy tính để bàn của người dùng khác là một vấn đề bảo mật, do đó không được phép. Nếu không, nó có thể dễ dàng bị lạm dụng để lừa đảo hoặc các nhiệm vụ độc hại khác. Không có quyền đặc biệt (như quyền truy cập siêu người dùng), không có cách nào để thực hiện những gì bạn muốn.

Ngay cả với quyền truy cập root trên máy, vẫn có câu hỏi liệu bạn có nên mở cửa sổ bật lên hay không. Bạn không biết trong trường hợp nào cửa sổ bật lên của bạn sẽ xuất hiện hoặc thậm chí liệu nó có xuất hiện hay không. Thông thường, trình quản lý cửa sổ có nhiệm vụ xử lý các cửa sổ mới xuất hiện. Nó có thể đặt nó ở đâu đó trên một khung nhìn không hoạt động hoặc tương tự, vì vậy nó thậm chí sẽ không hiển thị, mặc dù mở.

Tuy nhiên, có một cách tiêu chuẩn để liên lạc với người dùng trên máy. Đó là wall. Công cụ này vẫn yêu cầu quyền root (để ngăn chặn spam) nhưng sau đó nó ghi vào tất cả các TTY đang mở, thông báo hiệu quả cho người dùng đang chạy phiên X. Bạn có thể muốn xem xét sử dụng cái này thay vì cửa sổ bật lên.


Điểm an ninh tốt. +1

Thật không may, tôi đã đơn giản hóa lệnh của mình chỉ liên quan đến vấn đề trong tay nhưng thực tế, tôi đang lên kế hoạch cho kịch bản này và cần phản hồi của người dùng thông qua các nút. Tường dường như không cho đi để có được phản hồi của người dùng.
Peter Snow

Tôi đã cập nhật bài viết của mình để làm rõ hơn cách sử dụng của tôi.
Peter Snow

Hmm, thật khó khăn vì bạn không thể thực sự biết Desktop của người dùng sẽ làm gì với cửa sổ tiếp cận của bạn. Có thể có một trình nền chạy trên phiên X của người dùng mà bạn có thể liên hệ để hiển thị nội dung nào đó không? Đó sẽ là một cách tiếp cận sạch hơn là chỉ đơn giản là ném một cửa sổ lên màn hình của anh ấy. Một daemon như vậy có thể được viết theo cách để nó cũng hoạt động trên bảng điều khiển văn bản, v.v. Ngoài ra, bằng cách sử dụng wallbạn có thể yêu cầu người dùng chạy một lệnh cụ thể để cung cấp cho bạn thông tin phản hồi bạn muốn nhận được từ anh ta.
Alfe

2

Biến môi trường $XAUTHORITYgiữ đường dẫn đến tệp được sử dụng để giữ cookie ủy quyền X11. Điều này mặc định ~/.Xauthoritynếu không được đặt.

Vì vậy, với tư cách là root, bạn có thể thấy rằng những điều sau đây là đủ để cho phép bạn mở các cửa sổ trên màn hình của máy tính để bàn:

export DISPLAY=:0
export XAUTHORITY=~otheruser/.Xauthority
xmessage "Hello, otheruser."

Bây giờ, điều này sẽ không hoạt động nếu người dùng không lưu trữ cookie của họ trong tệp mặc định (điều này xảy ra vào, ví dụ, các phiên bản gần đây của Fedora). Trong trường hợp này, bạn có thể tìm ra những giá trị nào cần đặt $DISPLAY$XAUTHORITYvới:

cat /proc/$(echo $(ps -C gnome-shell -o pid=))/environ | xargs --null --max-args=1 | egrep '^(DISPLAY|XAUTHORITY)='

(thay thế gnome-shell bằng tên của trình quản lý cửa sổ của người dùng hoặc một số quy trình khác mà bạn chắc chắn rằng họ sẽ chạy).


1

Với sự giúp đỡ của trang này , bây giờ tôi có giải pháp như sau.

$ su
password:
$ xauth list
peter-aspire-ubuntu/unix:0  MIT-MAGIC-COOKIE-1  1978485c4f8d864503a4e645c77fd802
peter-aspire-ubuntu:0  MIT-MAGIC-COOKIE-1  1978485c4f8d864503a4e645c77fd802
$ DISPLAY=peter-aspire-ubuntu:0
$ export DISPLAY
$ cp /home/peter/.Xauthority /root/.Xauthority
cp: overwrite `/root/.Xauthority'? y
$ xmessage now

Kết quả là như dự định và phù hợp với tất cả các kịch bản được mô tả trong câu hỏi của tôi.

Cảm ơn tất cả những người tham gia.


0

Một cách để làm điều này là cho phép máy tính của bạn kết nối với máy chủ X của máy tính từ xa bằng cách sử dụng xhostcông cụ và chuyển tiếp X qua SHH. Trên máy tính từ xa, bạn cần cho phép máy tính của bạn nói chuyện với nó. Điều này yêu cầu X11Forwardingđược kích hoạt trong trình nền SSH chạy trên điều khiển từ xa.

Trên máy tính từ xa:

xhost <local_ip>

Trên máy tính cục bộ:

export DISPLAY=<remote_ip>:<display>
ssh -Y <username>@<remote_ip> <x_application>

Ví dụ: nếu điều khiển từ xa của bạn nằm 192.168.1.10trên mạng cục bộ của bạn:

export DISPLAY=192.168.1.10:0
ssh -Y root@192.168.1.10 xmessage now &
ssh -Y root@192.168.1.10 xeyes &

Cảm ơn htor, nhưng tôi muốn tránh đi đến độ dài X11Forwardingnếu có thể, đặc biệt là cho ứng dụng cục bộ tôi đã thêm vào trong bản cập nhật của tôi ở trên. Tôi sẽ ghi nhớ điều này mặc dù là phương sách cuối cùng!
Peter Snow

@PeterSnow Cũng lưu ý rằng việc chuyển tiếp X không thực sự cần thiết, nó chỉ tăng thêm tính bảo mật cho kết nối. Bạn chỉ có thể làm điều đó với xhostvà xuất DISPLAYra điều khiển từ xa.
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.