Como posso “sandbox” um script de shell?

5

Eu tenho um script de shell assim:

#/bin/sh
#do some stuff

Mas o intérprete, sh não está em /bin/ , mas em outro diretório. Da mesma forma, o script cria pastas em diretórios aos quais não tenho acesso de gravação. Eu substituí o diretório sh está usando sed mas com muitos scripts dependendo um do outro, eu não posso mudar todos os diretórios possíveis que eles possam criar.

Existe alguma maneira de emular um sistema de arquivos / leitura / escrita para que o script possa ser armazenado em sandbox e possa fazer o que agrada, semelhante ao que o Sandboxie faz no Windows?

    
por user230152 06.05.2017 / 13:38

3 respostas

5

O que você está procurando é, pelo menos, um ambiente chroot , ou seja, executar um programa com acesso apenas a uma subárvore da árvore de diretórios do sistema. Note que o chroot só se aplica a acessos ao sistema de arquivos, ele não limita o processo de qualquer outra forma: um processo em um chroot ainda pode acessar a rede, depurar programas fora do chroot, etc.

O chroot restringe os acessos ao sistema de arquivos até mesmo através de links simbólicos: se você tiver um link simbólico que aponta para fora do chroot, quando acessado de um processo chroot, um link simbólico absoluto vai da raiz do chroot e um link simbólico relativo com .. não sobe mais do que a raiz do chroot. Então, para montar um chroot contendo arquivos em locais separados, você não pode usar links simbólicos. Você pode usar montar montagens , copiar arquivos (mas isso ocupa espaço e eles não são 't actualizado automaticamente) ou usar links físicos (mas isso é inconveniente para configurar e não pode ser feito nos sistemas de arquivos).

A chamada do sistema chroot só pode ser chamada por root. Como usuário não-root, você pode usar o fakechroot . Isso só funciona em programas que são dinamicamente vinculados (que é a maioria deles). O Fakechroot pode montar uma árvore de diretório a partir de vários locais, então você não precisa usar montagens de bind (mas se você precisa de uma montagem de bind, você pode usar bindfs sem privilégios de root).

    
por 07.05.2017 / 00:58
-1

dê a si mesmo um diretório bin funcional, copie o script lá e substitua os nomes dos diretórios por substitutos.

no seu perfil.

ORIGINAL_PATH=${ORIGINAL_PATH:=$PATH}
PATH=$HOME/bin:${ORIGINAL_PATH}
export ORIGINAL_PATH

garante que você sempre tenha um PATH consistente

depois na linha de comando:

$ mkdir $HOME/bin
$ cp {the script you need} $HOME/bin
$ pushd $HOME/bin
$ vi {the script} 

alterando os nomes desses diretórios não graváveis para algo que você pode obter. então você pode:

$ pushd      # might take you HOME, if not cd $HOME
$ mkdir sbox # your "sandbox"
$ pushd sbox 
$ mkdir -p a/path/to/a/previously/unwriteable/ ...

este último cria um diretório:

 $HOME/sbox/a/path/to/a/previously/unwriteable/

Eu achei útil usar parâmetros posicionais, em vez de recortar e colar caminhos de arquivos longos. Se você for usar um nome repetidamente, faça algo assim:

$ set /DIR/Whichheld $HOME/sbox a/path/to/a/previously/unwriteable filename
$ echo $# $*

então isso

$ cp $1/$3/$4 $2/$3/$4 

cuida de um arquivo. Se você precisar de muitas cópias:

$ from=$1/$3
$ to=$2/$3
$ pushd $from
$ cp * $to
$ popd 
$ pushd $to

copiará todos os arquivos de FROM para TO ...

e boa sorte.

    
por 06.05.2017 / 17:39
-2

use ns . nuff sed .

demonstra uma maneira de esconder um diretório como:

mkdir /tmp/dir && {
    rm "$_" && cd /dev/fd/3
} 3</tmp/dir

de lado - desculpe, eu também entrei em uma farsa muito sofisticada, ou divindade, e por isso tive problemas com assinaturas e mantive um computador mais do que isso.

de qualquer forma, tome cuidado!

    
por 07.05.2017 / 08:28

Tags