Execute o subshell bash com comandos como outro usuário e não retorne ao shell pai

0

Como parte da minha missão de preservam bashrc e vimrc ao alternar para usuários não-root , planejo fazer alguns apelidos super feios para alternar para outros usuários, executar imediatamente alguns comandos e, em seguida, me deixar no prompt deles.

Execute um subshell de bash interativo com comandos iniciais sem retornar ao shell ("super") imediatamente não parece responder à minha pergunta. bash --init-file <(echo "ls; pwd; a=7") funciona como esperado; mas sudo bash --init-file <(echo "ls; pwd; a=7") não ( echo $a não retorna nada; nada é impresso no terminal de ls ou pwd ).

Por que o primeiro comando funciona, mas não o segundo? Como posso criar um comando bash que execute comandos no shell de outro usuário que persistentemente altere as variáveis de ambiente e acesse esse shell? Observe que isso é mais sobre como fazer isso funcionar para alternar para outros usuários não-root; Eu já tenho uma solução diferente que funciona para raiz .

    
por jeremysprofile 21.08.2018 / 21:04

1 resposta

1

% echo <(echo "ls; pwd; a=7")
/proc/self/fd/11
% bash
$ echo <(echo "ls; pwd; a=7")
/dev/fd/63

, portanto, a forma <(...) é, na verdade, um caminho para um descritor de arquivo específico para o shell que pode não estar disponível para outros processos; o bash one em particular é na verdade um pipe:

$ function hmm() { ls -al $1; }
$ hmm <(echo pwd)
lr-x------ 1 jhqdoe jhqdoe 64 Aug 21 14:58 /dev/fd/63 -> pipe:[910134]

sudo se preocupa por motivos de segurança para fechar todos esses descritores de arquivos por padrão (consulte --close-from opção docs em sudo(8) ). Você pode ser capaz de mexer com um desses descritores de arquivo (se as políticas de segurança permitirem e você estiver bem com o risco) através do closefrom_override e, em seguida, também --close-from , talvez.

Outro método seria usar expect e, em seguida, transformar as coisas para o usuário depois de executar alguns comandos:

#!/usr/bin/env expect
spawn -noecho bash
expect -ex {$}
send "pwd\r"
expect -ex {$}
interact
    
por 22.08.2018 / 00:04