Site muito bom, com muita coisa útil sobre shell (e shellscript) ao qual consulto eventualmente.
http://aurelio.net/shell/canivete/
Desenvolvimento Web, Administração Linux e Curiosidades
Site muito bom, com muita coisa útil sobre shell (e shellscript) ao qual consulto eventualmente.
http://aurelio.net/shell/canivete/
Útil para diretórios com muitos arquivos.
#!/bin/bash dir="/backup" for i in $(/bin/ls -la $dir | /bin/awk {'print $9'}) do if [[ ! -e "$dir/$i" && -L "$dir/$i" ]]; then echo "$dir/$i - symlink is broken!" fi done
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)
Mais um dos links “pra não esquecer”
http://www.bashguru.com/2010/01/shell-colors-colorizing-shell-scripts.html
Aqui algumas cores que costumo colocar em variáveis:
VERMELHO=' 33[31m' VERDE=' 33[32m' AMARELO=' 33[33m' AZUL=' 33[34m'
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
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"
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/
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
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"
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}$