Se /bin/bash
é um binário com dependências de bibliotecas compartilhadas, essas dependências precisam poder ser resolvidas dentro do chroot.
No meu sistema:
$ ldd $( command -v bash )
/usr/local/bin/bash:
Start End Type Open Ref GrpRef Name
0000115f08700000 0000115f08a0c000 exe 1 0 0 /usr/local/bin/bash
00001161f6a2e000 00001161f6c88000 rlib 0 1 0 /usr/lib/libtermcap.so.14.0
00001161bc41e000 00001161bc629000 rlib 0 1 0 /usr/local/lib/libintl.so.6.0
000011614b1de000 000011614b4dd000 rlib 0 2 0 /usr/local/lib/libiconv.so.6.0
00001161bd091000 00001161bd35b000 rlib 0 1 0 /usr/lib/libc.so.89.2
000011612ef00000 000011612ef00000 rtld 0 1 0 /usr/libexec/ld.so
Em contraste:
$ ldd $( command -v sh )
/bin/sh:
Start End Type Open Ref GrpRef Name
000007ca3c446000 000007ca3c6c6000 dlib 1 0 0 /bin/sh
Estou no OpenBSD. O formato da saída de ldd
será diferente em um sistema Linux, mas as mesmas informações essenciais (quais bibliotecas são compartilhadas e onde elas estão) também devem ser exibidas no Linux.
Quando eu tento com um chroot simplista muito que contém apenas /bin/sh
e /bin/bash
( doas
é o" sudo
replacement "do OpenBSD:
$ doas chroot -u kk t /bin/sh
/bin/sh: No controlling tty (open /dev/tty: No such file or directory)
/bin/sh: warning: won't have full job control
$ /bin/bash
Abort trap
Observe que eu recebo um shell ( /bin/sh
), mas esse /bin/bash
falha. O erro é diferente do seu, mas, na minha opinião, a mesma causa. Executar /bin/bash
diretamente com o comando chroot
apenas fornece uma mensagem "Abortar" de uma só palavra, presumivelmente devido ao mesmo problema com as bibliotecas.
Conclusão: O chroot precisa conter pelo menos uma instalação mínima de um sistema, incluindo arquivos de dispositivos e bibliotecas que são necessários para executar os executáveis dentro dele.
Explicação do erro "Nenhum arquivo ou diretório" no Linux:
Eu estava um pouco confuso sobre por que o erro era "Nenhum arquivo ou diretório desse tipo" no Linux, então fiz um teste em strace
.
A chamada execve()
que deveria ter executado o shell retorna ENOENT:
execve("/bin/bash", ["/bin/bash"], [/* 13 vars */]) = -1 ENOENT (No such file or directory)
... então achei que havia algo errado em encontrar /bin/bash
. No entanto, ao ler o manual execve(2)
, vi:
ENOENT
The file filename or a script or ELF interpreter does not exist, or a shared library needed for file or interpreter cannot be found.
Então lá vai você.