validação de usuário por uid

Script que retorna o usuário pelo UID, eu uso pra validação de usuário, pois pode haver algum username numérico (ex: adduser 1234)

#!/bin/bash

if [ -z $1  ]; then
        echo "USAR: $0 uid";
        exit 1
fi

FILE="/etc/passwd"
USER=`/bin/egrep -i "^$1:" $FILE |/bin/cut -d":" -f1 |/bin/sed ':a;N;$!ba;s/\n//g'`

if [ -z $USER ]; then
        USER=`/bin/grep ":x:$1:" $FILE |/bin/sed ':a;N;$!ba;s/\n/ /g' |/bin/awk '{print $1}' |/bin/cut -d":" -f1`
fi

echo $USER

O primeiro parametro do script deve ser o username ou uid (Ex: ./valida-user.sh 1234)

Usando expressões regulares no bash

Exemplo prático. Validando endereço de IP:

if [[ $IP_ADDR =~ ^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$ ]]; then
        echo "IP Valido"
else
	echo "IP Invalido"
fi

Para negar a validação

if [[ ! $IP_ADDR =~ ^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$ ]]; then
        echo "IP Invalido"
else
	echo "IP Valido"
fi

Lista de if em shellscript

Neste exemplo estou usando o comando test, mas pode ser com if também

test ­-r #Testa se tem permissão de leitura
test ­-w #Testa se tem permissão de escrita
test ­-x #Testa se tem permissão de execução
test ­-f #Testa se é um arquivo regular
test ­-d #Testa se é um diretório
test ­-u #Testa se seu SUID está ativado
test ­-g #Testa se seu SGID está ativado
test ­-s #Testa se seu tamanho é maior que zero

Exemplo:
Exibe o texto “ok” se o arquivo teste.txt possuir permissão de leitura:

test -r teste.txt && echo "ok"

Da pra usar os mesmos parametros usando IF:

if [ -r teste.txt ]; then echo "ok"; fi

Negação (exibe a mensagem se não tiver permissão de escrita):

test -r teste.txt || echo "nao ok"

chmod recursivo com referencia em outros arquivos/diretorios

Agradecimentos ao meu colega jb que me passou o parametro para isto.

Cenário: Alguem aplicou chmod 777 recursivo no /etc de um servidor web, alguns clientes tem conta de ssh limitadas, mas com esse nível de permissão qualquer um poderia ler/modificar configurações do servidor.

A contagem de arquivos no /etc é de aproximadamente 2600 arquivos, o que tornaria aplicar chmod manualmente em cada uma delas.

Por sorte esse servidor seria uma maquina virtual, onde outras provem do mesmo template. Entretanto coo /etc de um para outro não é uma opção, poiso  template de origem foi o mesmo, mas as configs são diferentes em cada um

Neste caso a solução foi simples, copiei o /etc de um servidor para dentro do /root deste com problema, no caso fiquei com /etc/ e /root/etc/. OBS: gzipiei e copiei, pra manter as permissões.

Usei a flag –reference do chmod pra copiar somente as permissões.

Comando executado:

for i in `/usr/bin/find /etc/`; do /bin/chmod --reference=/root$i $i; done

explicando em miúdos:
executei um find no /etc/ para obter todos os arquivos, usando um for para varrer cada linha e executando chmod em arquivo por arquivo do /etc baseado nas permissões existentes em /root/etc/

Atualizando rubygems no centos5

E la vou eu instalar uma aplicação redmine quando, de repente me surge essa “bomba”

$ gem install rake
ERROR:  Error installing rake:
rake requires RubyGems version >= 1.3.2

Oh, e agora ,quem poderá nos defender?

Bem, aquele erro basicamente diz que temos que atualizar a versão do rails, então… maos de sobra… digo, maos a bora

Instalando o RubyGens mais novo:

cd /tmp/
wget http://rubyforge.org/frs/download.php/55066/rubygems-1.3.2.tgz
tar xvzf rubygems-1.3.2.tgz 
cd rubygems-1.3.2
sudo ruby setup.rb

Agora sim, instalando o rake:

$ gem install rake

E, here we go!

$ rake --version
rake, version 0.9.2

Problemas com .gitignore

Esses dias foi necessário adicionar um arquivo já existente em um diretorio GIT ao .gitignore

Entretanto, como este arquivo já estava no projeto, a linha do .gitignore é ignorada (ironico, não?)

A solução é usar o utilizatior de remoção do git (muita hora nessa calma) usando a opção –cached conforme abaixo:

git rm --cached nome_do_arquivo.ext
git add .
git commit -m "ajustando .gitignore"

Para remover todo um diretorio do cache:

git rm -r --cached diretorio
git add .
git commit -m "ajustando .gitignore"

Alguns regex (expressões regulares) úteis

Tinha isso guardado num txt bem antigo, mas me são de grande utilidade:

#Email:
^([0-9,a-z,A-Z]+)([.,_,-]([0-9,a-z,A-Z]+))*[@]([0-9,a-z,A-Z]+)([.,_,-]([0-9,a-z,A-Z]+))*[.]([a-z,A-Z]){2,3}([0-9,a-z,A-Z])?$

#CEP:
^[0-9]{5}-{1}[0-9]{3}$

#Data (mm/dd/yyyy):
^((0?[1-9]|[12]d)/(0?[1-9]|1[0-2])|30/(0?[13-9]|1[0-2])|31/(0?[13578]|1[02]))/(19|20)?d{2}$

#Data (dd/mm/yyyy):
^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[012])\/[12][0-9]{3}$
#Hora:
^(?:[01]d|2[0-3]):[0-5]d:[0-5]d$

#Decimal:
^[+-]?((d+|d{1,3}(,d{3})+)(.d*)?|.d+)$

#float ou int
^([0-9])+(\.[0-9]{1,2})?$

#CPF:
^[0-9]{3}.[0-9]{3}.[0-9]{3}-[0-9]{2}$