Mostrando postagens com marcador linux. Mostrar todas as postagens
Mostrando postagens com marcador linux. Mostrar todas as postagens

quarta-feira, 23 de janeiro de 2013

Como acessar um diretório compartilhado no Windows via Linux

Depois de muito tempo sem postar nada, vou recomeçar com este post que é apenas uma dica rápida para acessar aquele diretório criado no Windows (possivelmente em uma rede doméstica) através de uma máquina com o sistema operacional Linux instalado.
Como exemplo temos o diretório compartilhado chamado shared criado na máquina cujo endereço é 192.168.0.102.

Primeiro crie um diretório onde queira montar o diretório remoto:
mkdir ~/maquina_do_fulano
Depois, basta executar o comando abaixo:
sudo mount -t cifs //192.168.0.102/shared ~/maquina_do_fulano
Porém você pode ter a seguinte saída:
mount: wrong fs type, bad option, bad superblock on //server/share,
       missing codepage or other error
       In some cases useful info is found in syslog - try
       dmesg | tail  or so
Olhando o log através do comando abaixo:
dmesg | tail

tive a seguinte saída:
[16380.011272] CIFS VFS: cifs_mount failed w/return code = -22
Para resolver este caso basou instalar os utilitarios do cifs onde é possível baixar o código fonte em:
http://www.linuxfromscratch.org/blfs/view/svn/basicnet/cifsutils.html
Após baixar, é só descompactar o arquivo, entrar no diretório e compilar o programa conforme a lista de comandos abaixo:
sudo ./configure --prefix=/usr
sudo make
sudo make install

Caso tenha tido o mesmo problema, agora execute o comando para montar o diretório novamente e pronto.

segunda-feira, 12 de março de 2012

trocando a permissão de arquivos e diretórios recursivamente no php

Hoje, vou postar aqui um código que no mínimo pode ser engraçado.
É interessante do ponto de vista das funções que são utilizadas no php para manipulação de arquivos e diretórios.

Tudo isso aconteceu porquê em um servidor que hospedo um site, alguns arquivos são gerados com o usuário do apache... o famoso www-data!

Por alguns arquivos serem gerados com www-data e com permissão de leitura e gravação apenas para o próprio www-data, eu não conseguia fazer nem um backup do meu projeto por causa destes arquivos os quais eu não possuia permissão com meu usuário.

Já estava ficando desesperado até que pensei o que era o mais óbvio! Basta criar um script e acessar pelo browser e o usuário www-data estará em ação =P
Então a solução foi executar este script que por sua vez altera a permissão dos arquivos e diretórios recursivamente (e apenas quando o arquivo estiver sob o poder do www-data!!!!).

Talvez alguém possa até passar por isso ou ter uma solução bem mais inteligente pois a minha acho que está bem estranha. Caso alguém estiver lendo este post e tiver alguma idéia que me ajude a fazer isso de forma melhor, por favor! não hesite em deixar um comentário...

Agora chega de lero lero e vamos ao código:


/** funcao que apenas faz a chamada recursiva.
* criei só para modularizar a chamada que é
* feita em 2 lugares diferentes */
private function recur($path) {
$dir = scandir($path);
for( $i=2; $i < count($dir); $i++) {
$this->salvaodia($path . '/' . $dir[$i]);
}
}

/**
* esta é a funçao que salvou o dia!
* portanto... para deixar o código um pouco mais divertido
* vou manter o nome salva o dia! afinal...
* essa funçaozinha merece o meu respeito */
private function salvaodia($path) {
// path eh o caminho raiz a partir do qual quero
// sair procurando e mudando permissao
$info = stat($path);
// se for o userdata(cada server tera um diferente =/ )
if ($info[4] == 43234) {
chmod($path, 0777); // nao façam isso fora de casa
if (is_dir($path)) {
$this->recur($path);
}
} else {
if (is_dir($path)) {
$this->recur($path);
}
}
}

/** e aqui fazendo a chamada da salvacao */
public function salvacao() {
$path = 'foo/bar/fubah';
$this->salvaodia($path);
echo 'salvou o dia';
exit();
}


Com o código acima podemos ver algumas funções interessantes para manipular os arquivos e diretórios que são elas:

stat: retorna um conjunto de informações sobre um arquivo/diretório
scandir: recupera a lista de arquivos dentro do diretório informado
chmod: muda a permissão do diretório segundo a configuração rwx-rwx-rwx onde (r=read, w=write, x=execute). Cada grupo de permissões dessas estão relacionadas ao dono, grupo e outros (UGO - user, group, owner).
is_dir: apenas indica se o arquivo corrente é um diretório.

segunda-feira, 20 de fevereiro de 2012

Variáveis de ambiente no Ubuntu

A algum tempo atrás voltei a estudar android. Enquanto estudava, configurei algumas variáveis de ambiente como $ANDROID_HOME. Porém, lembro que tive que executar o comando source para carregar as alterações que acabara de fazer no arquivo /etc/profile.

Na época que fiz a configuração acima, conseguia executar os programas adb, android e etc.
Porém quando voltei a estudar android e fui executar os comandos novamente: pffffffmmm! Não funcionou.

Foi então que decidi entender um pouco melhor o funcionamento das variáveis de ambiente no Ubuntu.

Depois de ler a documentação disponível em Environment Variables entendi o que estava acontecendo.

Quando imprimia o valor da variável $ANDROID_HOME, o conteúdo aparecia normalmente no shell.
Porém quando imprimia o valor de $PATH, o conteúdo que concatenei (no caso android path) não aparecia.

O problema era o seguinte:
o arquivo /etc/profile é carregado quando efetuado um login no shell (via console, ssh ou DisplayManager - quando a sessão do desktop é carregada). Porém além de executar muitas coisas ali dentro, no final o script chama outro script: o /etc/bash.bashrc que é uma versão do arquivo ~/.bashrc para carregamento em escopo de sistema.

Quando abri o arquivo /etc/bash.bashrc havia outro export para PATH porém com menos endereços, e isso sobrescrevia o que eu já havia definido em /etc/profile.

Agora para uma documentação breve em português, deixo aqui um resumo sobre estes arquivos de configuração pois é bem provável que eu precise disso a qualqer momento novamente =P

Variáveis de ambiente com escopo de sessão

As variáveis com escopo de sessão são válidas apenas para o usuário o qual a configuração foi realizada. Abaixo seguem os arquivos com escopo de sessão:

  • ~/.profile - conforme a documentação é provavelmente o melhor local para configuração das variáveis de ambiente com escopo de sessão pois além de ser executado durante o login via shell também é executado durante a inicialização no modo gráfico (mas só durante processo de login no shell ou modo gráfico).
  • ~/.bash_profile - caso este arquivo exista, o mesmo será executado ao invés do ~/.profile, porém não terá influência no modo gráfico, o que pode ser ruim para a maioria dos usuários. (quero fazer uma experiência criando alguma variável de ambiente no ~/.profile mesmo existindo o ~/.bash_profile pra ver se a mesma não será criada).
  • ~/.bashrc - configurando as variáveis neste arquivo, as mesmas serão carregadas no modo gráfico ou modo texto, porém com o inconveniente de serem carregas sempre que o bash for executado, sendo portanto não tão bom em termos de performance.


Variáveis de ambiente com escopo de sistema

As variáveis com escopo de sistema valem para qualquer usuário que se autentique no sistema.
  • /etc/environment - não é um arquivo de script mas sim um arquivo para adicionar definições do tipo chave=valor.
  • /etc/profile - este arquivo é executado sempre que realiza-se o login via shell ou via modo gráfico (via DisplayManager).
  • /etc/bash.bashrc - conforme dito anteriormente é a versão do ~/.bashrc porém com escopo de sistema.

Conforme a documentação do próprio Ubuntu diz, utilizar os arquivos /etc/profile, /etc/bash.bashrc, ~/.bashrc, ~/.bash_profile ou ~/.profile não é recomendado. Pelo que entendi o mais recomendado é utilizar os arquivos /etc/environment ou ~/.pam_environment. Ambos arquivos que não são scripts, mas apenas arquivos com definições. (o .pam_environment é a versão do environment para escopo de sessão, mas não havia comentado pois no meu ambiente este arquivo nem existe).

Bom, por hoje é só. Talvez esse pouco que entendi possa ajudar outras pessoas algum dia. Enquanto isso vou tentando aprender um pouco mais sobre o ubuntu e quem sabe escrever posts melhores =P


Referências:
ubuntu documentation: EnvironmentVariables
https://help.ubuntu.com/community/EnvironmentVariables