Como executar o comando "ls" no chroot?

8

Eu tenho trela do shell do navegador e estou executando comandos do shell no php e pressionando-os novamente para o navegador. Acabei de descobrir o comando chroot e quero executar, por exemplo, lsno diretório raiz do diretório alterado, na verdade, preciso executar bash -c "ls /". Eu tentei isso (tentei sem o sudo, mas não estava funcionando):

sudo chroot ~/projects/jcubic/leash ls

mas obteve erro:

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

eu uso esse comando corretamente? É possível executar ls em um diretório raiz diferente?

quando tento executar chroot sem sudo, recebo este erro:

chroot: cannot change root directory to '/home/kuba/projects/jcubic/leash': Operation not permitted
jcubic
fonte
3
Você entende o que chrooté suposto fazer?
Satō Katsura
1
@SatoKatsura Se bem entendi, mudo o /diretório para outro. Preciso ter binnesse diretório para executar comandos?
Jcubic
8
Sim: você precisa preencher a chrootprisão antecipadamente com todos os binários que deseja executar, todas as bibliotecas necessárias e o carregador dinâmico (se o seu sistema operacional usar uma). Além disso, apenas o root pode ser executado chroot, como você descobriu.
Satō Katsura

Respostas:

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

Para executar qualquer comando dentro do chroot, você precisa ter este programa disponível no chroot (já que ele não pode usar o programa instalado no /sistema de arquivos.

A maneira mais simples é copiar o /usr/bin/lsde para /home/kuba/projects/jcubic/leash/usr/bin/(você também precisará das bibliotecas compartilhadas dependentes:) ldd /usr/bin/ls.

Jakuje
fonte
Eu encontrei este artigo no help.ubuntu.com, como devo executar o chroot, porque não consigo encontrar essas informações. Devo executar chroot lucid /bin/bash -c "ls /"ouchroot /var/chroot /bin/bash -c "ls /"
jcubic
@ jcubic depende muito do que você deseja alcançar. A página de manual para chrooté um bom lugar para começar quando você tiver dúvidas sobre a sintaxe. O mesmo para outros comandos ( bash).
Jakuje 10/06
5

É possível executar lsem uma raiz diferente, mas o lscomando e todos os arquivos dos quais depende devem estar presentes nessa raiz. Não há como iniciar o lscomando e, nesse processo, altere a raiz: lsnão possui esse recurso.

O objetivo de um chroot é limitar a visibilidade dos arquivos àqueles em um determinado diretório. Quando você executa chroot ~/projects/jcubic/leash ls, o chrootcomando altera a raiz de seu próprio processo (alterar o diretório raiz afeta apenas o processo que faz isso e qualquer processo que é executado posteriormente) e tenta executar um arquivo executável chamado lsem um diretório no caminho de pesquisa. Como a raiz está agora ~/projects/jcubic/leash, o executável deve estar presente em um diretório como ~/projects/jcubic/leash/bin.

Se você deseja ter um sistema normal com os comandos usuais no chroot, é necessário instalar um. Ferramentas como debootstrap (para instalar um sistema Debian) ou ferramentas de provisionamento como o Docker (que configura um ambiente que é chroot e está confinado de outras maneiras) podem ajudar.

Se você deseja apenas o lscomando, ainda precisará copiar mais de ls. Para executar ls, você precisará copiar o lscomando e todos os arquivos dos quais depende. Como lsé um programa vinculado dinamicamente, você precisa do seu carregador dinâmico, bem como de todas as bibliotecas dinâmicas das quais depende. Execute ldd /bin/lspara 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 maneira mais simples de explorar é obter um binário vinculado estaticamente, por exemplo, do BusyBox (disponível no Debian e derivados como o busybox-staticpacote).

cp /bin/busybox .
chroot . ./busybox ls
Gilles 'SO- parar de ser mau'
fonte