Làm thế nào để lừa một chương trình nghĩ rằng không có máy chủ X đang chạy


28

Tôi có chương trình này có thể chạy với cả giao diện người dùng văn bản và giao diện người dùng đồ họa.

Nó thiếu bất kỳ chuyển đổi dòng lệnh nào để ép buộc cái này hay cái khác, thay vào đó tôi đoán nó bằng cách nào đó tự động phát hiện xem chúng ta có ở X hay không (ví dụ: nếu tôi chạy nó từ một thiết bị đầu cuối ảo, nó sẽ vào chế độ văn bản của nó và nếu tôi chạy nó từ một trình giả lập thiết bị đầu cuối X nó sẽ mở một cửa sổ đồ họa riêng).

Tôi muốn buộc nó vào chế độ văn bản và để nó chạy bên trong thiết bị đầu cuối X. Làm thế nào tôi sẽ làm về nó?

Câu trả lời:


40

Thường chỉ là

unset DISPLAY

trong dòng lệnh của thiết bị đầu cuối. Một số ứng dụng thông minh hơn thế, và thực sự kiểm tra quyền và loại bàn điều khiển so với giả hành.


7
Thật không may, một số phần mềm thực sự cố chấp sẽ giả định DISPLAY=:0nếu nó không được đặt. Tôi tin rằng bạn có thể khắc phục điều đó bằng cách chạy nó dưới một người dùng khác và sử dụng iptables để thả loopback X11, nhưng điều đó khá thô.
Kevin

2
@Kevin có lẽ DISPLAY=invalid:0?
nguồnjedi

2
@PeterCordes hoặc bạn có thể thực thi lệnh thông qua envthay vì một mạng con:env -u DISPLAY emacs foo.c
pabouk

2
@PeterCordes emacskhông có cờ dòng lệnh để vô hiệu hóa việc sử dụng X. Chỉ cần gõ emacs -nw. Nhưng nếu không, thay vào đó bạn có thể sử dụng DISPLAY= emacs, nó cũng hoạt động.
kasperd

2
DISPLAY=0.0.0.0:0thất bại ngay lập tức mà không thực hiện tra cứu máy chủ tên.
pts

31

Nếu bạn muốn tắt X cho một lệnh, bạn có thể viết

DISPLAY= ./my_command

Chú ý không gian trống chiến lược sau =. Tổng quát hơn, bạn có thể đặt các biến môi trường cho một quy trình bằng cách thêm tiền tố vào lệnh của bạn bằng một chuỗi các <variable>=<value>khoảng cách. Vì không gian đóng vai trò là dấu phân cách, =ngay lập tức theo sau là khoảng trắng sẽ xóa biến trước đó. Chúng ta có thể xem xét ảnh hưởng của các tiền tố này bằng cách sử dụng một lớp con làm lệnh và sau đó in môi trường của nó. Lấy ví dụ:

$ A=a B=b C= D=d sh
$ echo $A $B $C $D

Cái này sẽ in

a b d

Điều này cho thấy môi trường của subshell thực sự khác với dự định. Lưu ý rằng sự thay thế shell xảy ra trước khi các đối số riêng lẻ được truyền tới echo, do đó chỉ có một khoảng trắng duy nhất giữa bdtrong đầu ra, giống như dòng lệnh là echo a b d(có hai khoảng trắng).

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.