Como contabilizar vars de env de shell-session, contextos com chroot

1

Então, estou trabalhando em um script, vamos chamá-lo de chroot-session-builder , que monta um sistema de arquivos com um sistema operacional separado e, em seguida, me registra em um shell chrooted no outro sistema de arquivos. Funciona, mas sou um idiota e quero que funcione bem.

A parte relevante é esta:

mkdir -p $mount_point/root/bin && \
cp chroot-env-setup.sh $mount_point/root/bin/ && \
chroot $mount_point bash -c /root/bin/chroot-env-setup.sh && \
chroot $mount_point

Então, eu passei no script chroot-env-setup.sh . Ele roda e declara algumas coisas, o problema é:

export HOME=/root
export PATH=$PATH:/root/bin

## *** More functions...
## *** Calls to other scripts...

exit 0;

Que sai do contexto chroot e me traz de volta à execução chroot-session-builder no contexto da próxima chamada original do shell:

chroot $mount_point

Trazendo-me ao meu contexto chroot.

Agora, não era óbvio para mim até que eu fiz alguns testes, e achei isso: Como adicionar corretamente um caminho para o PATH? , o que está acontecendo é que a instrução export expõe a variável à sessão atual do shell. E o motivo da minha confusão foi ignorar que $HOME para root é /root de qualquer maneira . (face-palm) e assim, qualquer coisa que eu declarar, eu perco quando eu chroot de volta.

Eu vejo duas opções possíveis aqui:

1) Posso escrever echo "export PATH:$PATH/root/bin" >> para /root/.profile e quando

Isso não exigirá que eu use source /root/.profile manualmente depois que eu reinserir o contexto chroot, porque o novo shell irá ler de /root/.profile no carregamento.

2) A outra opção é se houver uma maneira de chroot $mount_point <with a command> e depois permanecer no contexto chroot a partir do script, para que o script chroot-env-setup.sh possa fazer isso é mágico, e eu não preciso me preocupar com a redefinição mais mudanças ambientais ou adicionar arquivos? (cada arquivo, ajuste de configurações que eu faço quando eu digito, eu tenho que levar em conta e adicionar ao script de limpeza antes de salvar o sistema de arquivos.)

    
por blanket_cat 20.04.2017 / 12:04

1 resposta

2

Tenho a impressão de que suas perguntas subseqüentes derivam de sua pergunta inicial (mas não posso dizer, não é fácil ler a linha de pensamento)

The relevant part is this:

mkdir -p $mount_point/root/bin && \
cp chroot-env-setup.sh $mount_point/root/bin/ && \
chroot $mount_point bash -c /root/bin/chroot-env-setup.sh && \
chroot $mount_point

A partir desse trecho, acho que você quer executar um script no ambiente chroot que faz a configuração inicial e, em seguida, insira o ambiente chroot com uma linha de comando interativa.

So I've passed in the chroot-env-setup.sh script. It runs and declares some stuff, the problem point being:

export HOME=/root
export PATH=$PATH:/root/bin

## *** More functions...
## *** Calls to other scripts...

exit 0;

Você não esclareceu, mas presumo que isso represente o conteúdo do script do construtor de sessão?

Se sim, export VARNAME=value só se aplica à sessão ou script do shell em que é executada, e não à sessão que o chama.

A palavra-chave export permite que os processos filhos herdam a variável, caso contrário, ela permanece estritamente no escopo da sessão / shell script em execução. As variáveis de ambiente NUNCA se aproximam do ambiente do chamador. Isso seria uma questão operacional catastrófica, para não mencionar um campo minado de segurança.

Com relação a onde colocar sua definição de variável:

Todos os usuários podem ter um arquivo ~/.bashrc e ~/.profile , mesmo root , root é de fato um usuário, ele só tem privilégios especiais e uma pasta pessoal em outro lugar.

Sua sessão bash começa no entanto com qualquer que seja o HOME atualmente definido. Ao chamar chroot , você precisa fornecer o destino pretendido HOME

  1. adicione export PATH=$PATH:/root/bin a $mountpoint/root/.bashrc
    • talvez também adicione echo Welcome to the chroot environment ao mesmo .bashrc para ver se funciona
  2. ao chamar o chroot, você precisa especificar a pasta inicial - não de dentro do chroot:
    • HOME=/root chroot $mountpoint

De fato, você especifica uma variável e chama um comando na mesma linha. Isso define a variável para o ambiente desse comando, não o ambiente atual em execução.

Para demonstração, tente

# Set var in current environment
MY_IS_SET=no

# Set var before calling env, which prints what its environment contains
MY_IS_SET=yes env | grep MY_IS_SET

# Check that current original environment is unchanged
echo $MY_IS_SET

As respostas para o resto das suas perguntas devem fluir daí?

    
por 20.04.2017 / 13:09