Làm thế nào để thực thi lệnh lsvs trong chroot?


8

Tôi có dây xích trình duyệt và tôi đang thực thi các lệnh shell trong php và giữ lại chúng cho trình duyệt và tôi vừa phát hiện ra lệnh chroot và tôi muốn chạy ví dụ lstrên thư mục gốc trên root đã thay đổi, thực tế tôi cần chạy bash -c "ls /". Tôi đã thử điều này (Tôi đã thử mà không có sudo nhưng nó không hoạt động):

sudo chroot ~/projects/jcubic/leash ls

nhưng có lỗi:

chroot: failed to run command ‘ls’: No such file or directory

Tôi có sử dụng lệnh này đúng không? Có thể chạy ls trên thư mục gốc khác nhau?

Khi tôi cố chạy chroot mà không có sudo, tôi đã gặp lỗi này:

chroot: cannot change root directory to '/home/kuba/projects/jcubic/leash': Operation not permitted

3
Bạn có hiểu những gì chrootcần phải làm?
Satō Katsura

1
@SatoKatsura Nếu tôi hiểu chính xác, tôi thay đổi /thư mục thành một thư mục khác. Tôi có cần phải có bintrong thư mục đó để chạy các lệnh không?
jcubic

8
Có: bạn cần phải điền vào chroottù trước với tất cả các nhị phân bạn muốn chạy, tất cả các thư viện họ cần trình tải động (nếu hệ điều hành của bạn sử dụng một). Cũng chỉ có root có thể chạy chroot, như bạn phát hiện ra.
Satō Katsura

Câu trả lời:


12
chroot: failed to run command ‘ls’: No such file or directory

Để chạy bất kỳ lệnh nào bên trong chroot, bạn cần phải có sẵn chương trình này trong chroot (vì nó không thể sử dụng chương trình được cài đặt trong /hệ thống tập tin.

Cách đơn giản nhất là sao chép /usr/bin/lstừ đến /home/kuba/projects/jcubic/leash/usr/bin/(bạn cũng sẽ cần các thư viện chia sẻ phụ thuộc ldd /usr/bin/ls:).


Tôi đã tìm thấy bài viết này trên help.ubfox.com, tôi nên chạy chroot như thế nào, vì tôi không thể tìm thấy thông tin đó. Tôi nên chạy chroot lucid /bin/bash -c "ls /"haychroot /var/chroot /bin/bash -c "ls /"
jcubic

@jcubic nó rất phụ thuộc vào những gì bạn muốn đạt được. Trang hướng dẫn sử dụng chrootlà một nơi tốt để bắt đầu khi bạn nghi ngờ về cú pháp. Điều tương tự cho các lệnh khác ( bash).
Jakuje

5

Có thể chạy lstrong một root khác, nhưng lslệnh và tất cả các tệp mà nó phụ thuộc phải có trong root đó. Không có cách nào để bắt đầu lslệnh, và sau đó bên trong quá trình đó thay đổi gốc: lskhông có tính năng này.

Toàn bộ quan điểm của một chroot là giới hạn khả năng hiển thị của các tệp đối với những tệp trong một thư mục nhất định. Khi bạn chạy chroot ~/projects/jcubic/leash ls, chrootlệnh thay đổi gốc của quy trình riêng của nó (thay đổi thư mục gốc chỉ ảnh hưởng đến quá trình thực hiện và bất kỳ quy trình nào sau đó chạy), sau đó cố gắng chạy tệp thực thi được gọi lstrong thư mục trên đường dẫn tìm kiếm. Vì gốc là bây giờ ~/projects/jcubic/leash, nên tệp thực thi phải có trong một thư mục như ~/projects/jcubic/leash/bin.

Nếu bạn muốn có một hệ thống bình thường với các lệnh thông thường trong chroot, bạn cần cài đặt một hệ thống. Các công cụ như debootstrap (để cài đặt hệ thống Debian) hoặc các công cụ cung cấp như Docker (thiết lập một môi trường được điều chỉnh và bị giới hạn theo các cách khác) có thể giúp ích.

Nếu bạn chỉ muốn lslệnh, bạn vẫn sẽ cần sao chép nhiều hơn ls. Để chạy ls, bạn sẽ cần sao chép lslệnh cũng như tất cả các tệp mà nó phụ thuộc. Vì lslà một chương trình được liên kết động, bạn cần bộ tải động của nó cũng như tất cả các thư viện động mà nó phụ thuộc. Chạy ldd /bin/lsđể liệt kê các thư viện động cần thiết. Ví dụ:

mkdir -p bin lib/x86_64-linux-gnu
rsync -a /bin/ls bin/
rsync -a /lib/x86_64-linux-gnu/ lib/x86_64-linux-gnu/
chroot . ls

Ngoài ra, một cách đơn giản hơn để khám phá là lấy một tệp nhị phân được liên kết tĩnh, ví dụ như BusyBox (có sẵn trên Debian và các dẫn xuất dưới dạng busybox-staticgói).

cp /bin/busybox .
chroot . ./busybox ls
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.