Ls

如何在 chroot 中執行“ls”命令?

  • September 10, 2018

我有瀏覽器 shell皮帶,我在 php 中執行 shell 命令並將它們返回到瀏覽器,我剛剛發現了 chroot 命令,我想ls在更改的根目錄上執行例如,實際上我需要執行bash -c "ls /". 我試過這個(我試過沒有 sudo 但它不起作用):

sudo chroot ~/projects/jcubic/leash ls

但出現錯誤:

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

我要正確使用這個命令嗎?是否可以在不同的根目錄上執行 ls ?

當我嘗試在沒有 sudo 的情況下執行 chroot 時,出現此錯誤:

chroot: cannot change root directory to '/home/kuba/projects/jcubic/leash': Operation not permitted
chroot: failed to run command ‘ls’: No such file or directory

要在 chroot 中執行任何命令,您需要在 chroot 中提供該程序(因為它不能使用安裝在/文件系統中的程序。

最簡單的方法是將 from 複製/usr/bin/ls/home/kuba/projects/jcubic/leash/usr/bin/(您還需要依賴的共享庫:)ldd /usr/bin/ls

可以ls在不同的根目錄中執行,但ls命令及其依賴的所有文件都必須存在於該根目錄中。無法啟動ls命令,然後在該過程中更改根目錄:ls沒有此功能。

chroot 的全部意義在於將文件的可見性限制為特定目錄下的文件。當您執行時chroot ~/projects/jcubic/leash ls,該chroot命令會更改其自己程序的根目錄(更改根目錄只會影響執行它的程序以及它隨後執行的任何程序),然後嘗試執行ls在搜尋路徑上的目錄中呼叫的執行檔。由於現在是根目錄~/projects/jcubic/leash,因此執行檔必須存在於諸如~/projects/jcubic/leash/bin.

如果你想在 chroot 中擁有一個帶有常用命令的普通系統,你需要安裝一個。諸如debootstrap(用於安裝 Debian 系統)之類的工具或諸如 Docker 之類的配置工具(它設置了一個 chrooted 並以其他方式受限的環境)可以提供幫助。

如果你只想要ls命令,你仍然需要複製多個ls. 要執行ls,您需要複製該ls命令以及它所依賴的所有文件。由於ls是一個動態連結的程序,你需要它的動態載入器以及它所依賴的所有動態庫。執行ldd /bin/ls以列出所需的動態庫。例如:

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

或者,一種更簡單的探索方法是獲取靜態連結的二進製文件,例如BusyBox(在 Debian 和衍生產品上作為busybox-static軟體包提供)。

cp /bin/busybox .
chroot . ./busybox ls

引用自:https://unix.stackexchange.com/questions/370329