Arquivos de configuração do Bash sendo lidos em contradição com 'man bash'

0

Ao tentar determinar as diferenças entre .bashrc e .bash_profile , percebo que .bashrc nunca é lido e que .bash_profile é lido apenas a partir do SSH, mas não do PHP. Isso parece contradizer as informações em man bash . Alguém poderia me explicar por que isso funciona? O servidor parece ser uma variante do CentOS 5.

local$ ssh user@server
Last login: Wed Jan 23 23:21:23 2013 from 1.2.3.4

$ cat .bashrc
alias br='echo fromBR'
$ cat .bash_profile
alias bp='echo fromBP'

$ br
-bash: br: command not found
$ bp
fromBP

$ cat public_html/bashtest.php 
<?php
echo "hello\n";
echo shell_exec('bp');
echo shell_exec('br');
?>
$ php public_html/bashtest.php
hello
sh: bp: command not found
sh: br: command not found

$ wget server/bashtest.php
23:35:13 (759.55 KB/s) - 'bashtest.php' saved [7/7]
$ cat bashtest.php 
hello!

Portanto, parece que .bashrc nunca é lido e .bash_profile é lido apenas da CLI (não do PHP na CLI do usuário nem através do Apache). Além disso, através do Apache, o texto "comando não encontrado" nem é retornado!

Esse comportamento esperado (ou seja, estou interpretando mal o man bash ) ou algo está errado?

    
por dotancohen 24.01.2013 / 08:40

1 resposta

3

Bem, para começar, o PHP não está fazendo shell_exec a bash no seu caso, está fazendo isso através de sh . Isso é bastante óbvio a partir da mensagem de erro exata. Estou adivinhando que isso é controlado pelo shell especificado em / etc / passwd para o usuário que o servidor da Web está executando e o shell_exec não captura stderr, em combinação com isso quando você executa PHP da linha de comando simplesmente cai para $ {SHELL}. Quando lançado como sh, o bash desativa vários recursos para melhor imitar o comportamento do shell sh original. O fornecimento de .bashrc e .bash_profile quase certamente está entre esses, se não por outro motivo, porque esses arquivos provavelmente usarão sintaxe ou extensões específicas do bash.

Eu não tenho muita certeza sobre o caso SSH, mas a julgar pelo prompt $ simples, você pode muito bem estar trabalhando lá, o que também explica o comportamento que você está vendo. Experimente echo ${SHELL} para ver o que você realmente caiu. que deve funcionar em todas as conchas.

Dito isto , parece-me uma péssima ideia depender dos alias bash de um script PHP. Se o que você quer fazer é muito longo para se encaixar muito bem na declaração shell_exec (que deve ser usada apenas com muito cuidado), fazer uma função PHP para criar a linha de comando a partir dos parâmetros e chamando isso é quase certamente muito melhor abordagem, e funcionará essencialmente independentemente do qual o shell está instalado, selecionado ou como está configurado. Como alternativa, considere chamar um arquivo de script externo, que pode ser gravado no bash e especificar / bin / bash como seu interpretador. Mas, então, seu aplicativo exigirá que o bash seja instalado (o que provavelmente já acontece se depender de aliases do bash ...).

    
por 24.01.2013 / 09:51