Você pode usar o PRoot quase da mesma maneira que no seu exemplo:
proot -b /fake-home:/home ls /home
Ao contrário do BindFS / FUSE, o PRoot é capaz de ligar arquivos e diretórios que você não possui.
Para um processo de usuário, quero montar um diretório em outro local, mas no espaço do usuário, sem privilégios de root. Algo como mount --bind / origin / dest, mas com um wrapper vfs. Como um chroot ajustado pelo modo de usuário.
O programa envolveria os syscalls em arquivos para "substituir" os caminhos necessários. Poderia ser chamado com uma linha de comando como:
bindvfs / fake-home: / home ls / home
Eu tenho certeza que isso já existe! :)
Você pode usar o PRoot quase da mesma maneira que no seu exemplo:
proot -b /fake-home:/home ls /home
Ao contrário do BindFS / FUSE, o PRoot é capaz de ligar arquivos e diretórios que você não possui.
O programa papagaio pode
faça o que você pede: intercepte as chamadas do sistema e redirecione
caminhos (por exemplo, todos os caminhos que começam com /anonftp
são remapeados para
acesso transparente a arquivos remotos via FTP). Ele também é executado inteiramente em
userspace.
No entanto, apesar de uma impressionante variedade de redes comuns e incomuns
protocolos, parrot
não tem nenhum módulo para fazer simples
sistema de arquivos- > sistema de arquivos reescrevendo como você pede. Isso deveria ser
bastante simples de adicionar, se você souber alguma programação em linguagem C.
Como alternativa, bindfs (que
funciona em cima de FUSE ), funciona como um
mount --bind
no espaço do usuário. (Mas isso vai na direção inversa
em relação a redirecionar /home
para /fake-home
como você mencionou na sua pergunta.
O VFS já permite a montagem não-raiz de sistemas de arquivos. Você pode adicionar a opção user
ou users
à entrada fstab e certificar-se de que vfs.usermount=1
esteja em /etc/sysctl
.
Nada disso lhe dará controles parecidos com o chroot. A opção bind
não vai alterar permissões ou permitir um acesso 'alternativo', esta é uma segunda entrada do mtab para o mesmo sistema de arquivos e conteúdo exatos. Modificações na montagem da ligação afetam o original.
Eu me certificaria de esclarecer sua meta final antes de prosseguir.
mount_namespaces permitirá que você faça mount --bind
não visto por outros processos. Mas normalmente mount --bind
é restrito apenas ao usuário root (por motivos de segurança). Portanto, para que mount_namespaces sejam de alguma utilidade para um usuário não-root, você deve primeiro usar user_namespaces para se tornar um "raiz local" em um novo namespace, onde essa operação seria permitida.
Você pode brincar com isso em seu shell assim: este exemplo mostra especificamente o uso de espaços de usuário e montagem na preparação de um diretório chroot (e a operação chroot
é normalmente privilegiada também):
unshare --user --map-root-user --mount-proc --pid --fork
mkdir -p newroot/dev
mount --rbind /dev newroot/dev
....other chroot preparation....
chroot newroot
su - user1
Note que estou usando mount --rbind
(em vez de mount --bind
), porque somente isso funcionará no novo espaço de nome de usuário e montagem, se o diretório incluir outros pontos de montagem (e /dev/
no meu caso ).
Talvez a explicação para isso seja que o usuário não deve conseguir ver algo que normalmente um usuário sem privilégios não veria, ou seja, os subdiretórios ocultos pelas "submontagens". Para não retirar as submontagens, apenas --rbind
é permitido.
Tags mount chroot linux not-root-user