Global / etc / profile setenv ou exporta as configurações do usuário sobrescrevendo em .profile

5

Eu preciso chamar uma versão modificada de um programa em /home/user_name/bin em vez da versão (mais antiga) em /opt/program_name/current em um cluster do CentOS 5.3. O programa cria um script tcsh usando python e, em seguida, executa esse script.

Eu posso sobrescrever o PATH para chamar a versão modificada do programa em ~/bin , de modo que which program_name identifique o caminho para ~/bi n. Eu fiz isso em .bashrc , .profile , .tcshrc e .cshrc . No entanto, toda vez que o tcsh é executado, variáveis ambientais de /etc/profile são carregadas e o caminho é revertido para /opt/program_name/current .

Estas variáveis específicas do programa são definidas quando /etc/profile.d/program_name.sh é chamado por /etc/profile :

# /etc/profile 
for i in /etc/profile.d/*.sh ; do
    if [ -r "$i" ]; then
        . $i
    fi
done
unset i

Assim, quando program_name.sh é chamado, o script correspondente é:

# /etc/profile.d/program_name.sh
setenv PATH ${PATH}:/opt/program_name/current

Como posso impedir que /etc/profile seja acessado pela minha conta de usuário?

Eu não tenho acesso ao su e outros usuários ainda estão usando a versão mais antiga do software em /opt/program_name/current , por isso não posso atualizar o software nem modificar as configurações em /etc/profile.d/program_name.sh

    
por David 20.11.2012 / 23:01

2 respostas

1

tcsh não lê espontaneamente /etc/profile , deve haver algo no script causando isso. Uma possibilidade provável (mas não a única) é que o script começa com #!/bin/tcsh -l , então o tcsh age como um shell de login. Isso ainda não fará com que ele leia /etc/profile , mas fará com que ele leia /etc/csh.login , que pode ler outros arquivos (não sei o que o CentOS envia em csh.login nem como os administradores do sistema o personalizaram) ).

Depois de ler /etc/csh.login , tcsh lê ~/.login . Dependendo de como ele foi configurado, ele pode ler ~/.login antes, depois ou em vez de ~/.tcshrc . Portanto, não se esqueça de tentar também substituir PATH em ~/.tcshrc .

Se isso não funcionar, modificar o script Python pode ser sua melhor aposta. Se o código estiver em um módulo, você poderá contorná-lo colocando um módulo de wrapper em PYTHONPATH que carrega o original e faz algumas alterações.

Se isso falhar, não há uma maneira fácil de "redirecionar" o acesso ao executável do programa ou ao tcsh. Isso é possível, em princípio, usando LD_PRELOAD para envolver algumas funções de acesso a arquivos (se todos os programas envolvidos estiverem dinamicamente vinculados e não configurados [ug] id), mas é muito trabalho.

Pode haver uma maneira mais fácil de entrar no script em algum lugar, por exemplo, sobrescrevendo um dos programas chamados perto do início do script com uma função definida em seu .cshrc . É difícil ser mais preciso sem ver esse roteiro.

    
por 21.11.2012 / 00:59
0

Sua melhor aposta é provavelmente não depender de PATH , mas dar o caminho completo para program_name .

Quanto ao motivo pelo qual ele está fornecendo / etc / profile, ele deve ser chamado por /etc/csh.chsrc ou possivelmente /etc/csh.login . Para mais informações, consulte a página man de tcsh . Especificamente, procure (pesquisa) pelas seções Startup and shutdown e FILES na página man.

De Inicialização e desligamento , esta é a parte mais relevante:

A login shell begins by executing commands from the system files /etc/csh.cshrc and /etc/csh.login/. It then executes commands from files in the user's home directory

...

Non-login shells read only /etc/csh.cshrc and ~/.tcshrc or ~/.cshrc on startup.

E de FILES (que abrange todos os sabores * nix):

   /etc/csh.cshrc  Read first by every shell.  ConvexOS, Stellix and Intel
                   use /etc/cshrc and  NeXTs  use  /etc/cshrc.std.   A/UX,
                   AMIX,  Cray  and IRIX have no equivalent in csh(1), but
                   read this file in tcsh anyway.  Solaris  2.x  does  not
                   have it either, but tcsh reads /etc/.cshrc.  (+)
   /etc/csh.login  Read  by  login shells after /etc/csh.cshrc.  ConvexOS,
                   Stellix   and   Intel   use   /etc/login,   NeXTs   use
                   /etc/login.std,  Solaris 2.x uses /etc/.login and A/UX,
                   AMIX, Cray and IRIX use /etc/cshrc.
    
por 28.12.2017 / 21:57