É possível executar ls
em uma raiz diferente, mas o comando ls
e todos os arquivos dos quais ele depende devem estar presentes dentro dessa raiz. Não há como iniciar o comando ls
e, em seguida, dentro desse processo, alterar a raiz: ls
não possui esse recurso.
O ponto principal de um chroot é limitar a visibilidade dos arquivos àqueles sob um determinado diretório. Quando você executa chroot ~/projects/jcubic/leash ls
, o comando chroot
altera a raiz de seu próprio processo (a alteração do diretório raiz afeta apenas o processo que o realiza e qualquer processo executado subseqüentemente) e, em seguida, tenta executar um arquivo executável chamado ls
em um diretório no caminho de pesquisa. Como a raiz agora é ~/projects/jcubic/leash
, o executável deve estar presente em um diretório como ~/projects/jcubic/leash/bin
.
Se você quer ter um sistema normal com os comandos usuais no chroot, você precisa instalar um. Ferramentas como debootstrap (para instalar um sistema Debian) ou ferramentas de provisionamento como o Docker (que configura um ambiente que é chrooted e está confinado de outras formas) pode ajudar.
Se você quiser apenas o comando ls
, ainda precisará copiar mais de ls
. Para executar ls
, você precisará copiar o comando ls
, assim como todos os arquivos dos quais ele depende. Como ls
é um programa vinculado dinamicamente, você precisa do carregador dinâmico e de todas as bibliotecas dinâmicas das quais depende. Execute ldd /bin/ls
para listar as bibliotecas dinâmicas necessárias. Por exemplo:
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
Como alternativa, uma forma mais simples de explorar é obter um binário vinculado estaticamente, por exemplo, de BusyBox (disponível em Debian e derivados como o pacote busybox-static
.
cp /bin/busybox .
chroot . ./busybox ls