Không thể đặt LD_LIBRARY_PATH bằng màn hình


13

Chạy screentrong bash sẽ xóa biến LD_LIBRARY_PATH. Tôi đã đọc xong và có vẻ như đây là hành vi được mong đợi, nhưng tôi cần phải khắc phục nó.

Giải pháp thay thế là thêm khai báo LD_LIBRARY_PATH vào ~/.bashrc. Trong trường hợp của tôi, LD_LIBRARY_PATH bị thay đổi rất nhiều giữa việc khởi chạy shell và khi tôi gọi màn hình, vì vậy tôi cần lấy giá trị hiện tại của LD_LIBRARY_PATH vào screenphiên.


bạn đã xuất LD_KLIBRARY_PATH trước khi chạy màn hình?
kinnou02

Câu hỏi siêu người dùng.
karlphillip

Xin lỗi, bằng cách nào đó tôi có thể di chuyển nó qua, hoặc tôi nên xóa và đăng lại?

Nếu bạn nhận được năm phiếu gần, nó sẽ tự động được gửi ở đó. Một lần nữa để đi!
Thomas

Câu trả lời:


14

screenkhông đặt biến môi trường; nó được gỡ bỏ bởi chính Linux.

Trên hầu hết các hệ thống, /usr/bin/screentệp thực thi được cài đặt với bit setgid cho utmpnhóm, để có thể sửa đổi utmpcơ sở dữ liệu. Nó cũng sử dụng setgid để kiểm soát truy cập vào thư mục socket ( /var/run/screen/).

Trên Linux, khi chương trình setuid (hoặc setgid ) được chạy, nó không nhận được một số biến môi trường nhất định (bao gồm LD_LIBRARY_PATH, một số LD_*biến khác và HOSTALIASES), để giảm các điểm tấn công có thể xảy ra: Nếu không, bạn có thể viết một thư viện nhỏ và lừa suhoặc sudogọi các chức năng "cải tiến" của bạn theo cách đó.


Bạn có thể xóa bit setgid khỏi screen, nhưng bạn sẽ phải làm cho thư mục socket hoàn toàn có thể truy cập được bởi mọi người (chế độ 0777). Tuy nhiên, đó không phải là một rủi ro bảo mật, screencũng như kiểm tra chính UID của kẻ săn trộm.

Tuy nhiên, bạn không nên làm cho utmpcơ sở dữ liệu có thể ghi được.


(Lưu ý: Tôi không hoàn toàn chắc chắn cho dù các biến môi trường được loại bỏ bởi hạt nhân, hoặc bằng cách ld-linux.so, hoặc bằng cách glibc runtime.)
user1686

Làm việc thực sự tốt. Đây là những lệnh cần phải được thực hiện: chgrp root $(which screen)chmod 777 /var/run/screen. Bạn có thể kiểm tra với tập lệnh bash nhỏ này: while true; do echo $LD_LIBRARY_PATH; sleep 2; done Bạn sẽ thấy đường dẫn được hiển thị thành công. Cảm ơn sự tham lam.
lepe

7

Trong của bạn .screenrc, bạn có thể sử dụng setenvlệnh để đặt giá trị trong môi trường của màn hình.

setenv LD_LIBRARY_PATH $LD_LIBRARY_PATH_SCREEN

Điều này được đặt trước khi vỏ của bạn được bắt đầu. Rõ ràng LD_LIBRARY_PATH_SCREENcần phải được thiết lập trước khi bạn bắt đầu màn hình.


1
Xem câu trả lời của grawity - LD_LIBRARY_PATH là một biến đặc biệt trong ngữ cảnh này. Ngay cả khi điều này hoạt động (setenv không cần '=', btw), sẽ rất hữu ích để đổi tên biến môi trường mà chúng tôi đang cố gắng đặt; các chương trình vẫn sẽ nhìn vào tên chính tắc (xem stackoverflow.com/questions/13974069/iêu ).
Andrew Wood

Hơn là để sửa chữa. Tôi đã sửa lỗi cú pháp và quên rằng tôi có một biến khác trong màn hình bắt đầu môi trường. Một _SCREENtrong những có thể được thiết lập trong tập tin RC của bạn hoặc trong một kịch bản trình bao bọc bắt đầu màn hình.
Droj

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.