quarta-feira, 8 de maio de 2019

Shell Script: tratamento de argumentos e opções

0 comentários
Na grande maioria das vezes, a linguagem shell script é usada para criar uma sequência de comandos que automatizam uma tarefa. Nisso, ela é extremamente eficiente e rápida. Combinar comandos é uma grande vantagem que o jeito UNIX de ser nos trouxe: várias ferramentas que fazem tarefas básicas, especializadas, e que quando se juntam realizam grandes feitos trabalhando juntas. Mas isso nunca impediu que se criasse também programas completos em shell script.
Uma característica para deixar um shell-script mais robusto e menos “sequencial/batch-mode” é o tratamento de argumentos. No meu clássico tutorial Programando em Shell-Script, o tópico Variáveis Especiais nos traz os primeiros itens que devemos aprender para o tratamento de argumentos. Existem variáveis especiais que tratam os argumentos passados para um programa ou uma função. Estes são:
  • $0 – Retorna o nome do script que foi executado
  • $N – Onde N é um número, corresponde ao argumento passado (1 = primeiro argumento, 2 = segundo argumento, 3 = terceiro argumento, etc)
  • $* – Retorna todos os argumentos de uma vez.
  • $# – Retorna a quantidade de argumentos passado para o script. (argc)
Vejamos agora um shell-script exempo que faz uso de todos esses argumentos:
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
#!/bin/bash
 
if [ $# -lt 1 ]; then
   echo "Faltou utilizar pelo menos um argumento!"
   exit 1
fi
 
echo "Numero de argumentos: $#"
 
COUNT=0
for ARG in $*; do
   COUNT=`expr $COUNT + 1`
   echo "Argumento $COUNT: $ARG"
done
As linhas 3 a 6 verificam se a quantidade de argumentos ($#) é menor (-lt – less than) que 1. Ou seja, se o usuário não chamou o programa com nenhum argumento, ele imprime um erro e sai do programa com status 1.
A linha 8 mostra quantos argumentos foram utilizados, usando novamente o $#.
O resto das linhas, 10 a 14, usam o $* com um laço for e um contador para mostrar quais foram os argumentos.
Executando agora este script sem argumentos:
$ ./tmp.sh
Faltou utilizar pelo menos um argumento!
Agora executando com dois argumentos:
$ ./tmp.sh naosei testando
Numero de argumentos: 2
Argumento 1: naosei
Argumento 2: testando
E agora com 4 argumentos:
$ ./tmp.sh a b c d
Numero de argumentos: 4
Argumento 1: a
Argumento 2: b
Argumento 3: c
Argumento 4: d
Bem simples né?

Argumentos como opções e seus valores

Algo comum que vemos nos programas são opções. Opções não deixam de ser argumentos para um programa, mas eles tem um significado especial. Do tipo: Se a opção -d existir, ativar durante o programa o modo de depuração. Se houver um -h, então mostre uma ajuda e não faça mais nada. Se houver um -v mostre a versão, e por aí vai.
Exemplo:
?
01
02
03
04
05
06
07
08
09
10
11
#!/bin/bash
 
case $1 in
   "-h") echo "Isto seria uma ajuda... Mas fiquei com preguiça de escrevê-la."
         ;;
   "-v") echo "Versão 666."
         ;;
   *) echo "Opção inválida!"
      exit 1
      ;;
esac
Exemplos do uso do script:
$ ./tmp.sh -h
Isto seria uma ajuda... Mas fiquei com preguiça de escrevela.
 
$ ./tmp.sh -v
Versão 666.
 
$ ./tmp.sh -O
Opção inválida!
 
$ ./tmp.sh
Opcao invalida!
Com isso a gente resolve um problema e cria mais outros dois…
  • E se o usuário colocar as duas opções? Só uma funcionaria.
  • E se uma das opções precisasse de um valor? Estilo “-f arquivo.log” gravaria um arquivo de log com as operações.
Poderíamos escrever vários algoritmos que verificassem cada um de todos os argumentos, testasse se fosse um ou outro, utilizasse as opções… Mas felizmente não precisamos fazer nada disso! O bash conta com uma função interna que trata os argumentos: o famoso getopts.

Utilizando o getopts para tratar tratar argumentos e opções

Seguindo a mesma linha de raciocínio, vamos logo para um exemplo de programa. Supondo que queiramos um shell-script que faça isso:
  • Caso a opção -h seja usada, mostra a ajuda e sai do programa.
  • Caso a opção -v seja usada, mostra a versão e sai do programa.
  • Caso a opção -o seja usada, grava um arquivo de log com as operações efetuadas e resultados.
  • Caso a opção -u seja usada, mostra o resultado do comando “uname -a”
  • Caso a opção -m seja usada, mostra o resultado do comando “free -m”
  • Caso a opção -s seja usada, mostra o resultado do comando “swap -s”
Note que apenas as opções -h e -v saem do programa após a execução. Agora vamos ao código:
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/bin/bash
 
function PrintUsage() {
   echo "Uso: `basename $0` <-umsf> [-ohv]"
   exit 1
}
 
while getopts "hvo:umsf" OPTION
do
   case $OPTION in
      h) PrintUsage
         ;;
      v) echo "`basename $0` versao 666."
         exit
         ;;
      o) ARQUIVO_LOG=$OPTARG
         ;;
      u) DO_UNAME=1
         ;;
      m) DO_FREE=1
         ;;
      s) DO_SWAPON=1
         ;;
      ?) PrintUsage
         ;;
   esac
done
shift $((OPTIND-1))
 
if [ -z "$DO_UNAME" ] && [ -z "$DO_FREE" ] && [ -z "$DO_SWAPON" ] && [ -z "$DO_FDISK" ]; then
   PrintUsage
fi
 
if [ "$ARQUIVO_LOG" ]; then   echo "Execucao iniciada em `date`." >> $ARQUIVO_LOG
 
   if [ "$DO_UNAME" == 1 ]; then
      uname -a >> $ARQUIVO_LOG
   fi
 
   if [ "$DO_FREE" == 1 ]; then
      free -m >> $ARQUIVO_LOG
   fi
 
   if [ "$DO_SWAPON" == 1 ]; then
      swapon -s >> $ARQUIVO_LOG
   fi
else
   echo "Execucao iniciada em `date`."
   if [ "$DO_UNAME" == 1 ]; then
      uname -a
   fi
 
   if [ "$DO_FREE" == 1 ]; then
      free -m
   fi
 
   if [ "$DO_SWAPON" == 1 ]; then
      swapon -s
   fi
fi
O interessante para nós são as linhas 8 a 28. O laço while getopts começa a tratar todos os argumentos. A cada iteração do laço, ele coloca a letra da opção na variável $OPTION.
Note que para cada opção que precisamos, colocamos uma letra no primeiro argumento do getopts:
?
1
while getopts "hvo:umsf" OPTION
Note também que depois da letra o temos um dois pontos (:). Esse dois pontos significa que logo após a opção -o, o usuário precisa fornecer um valor. Este valor é automaticamente armazenado na variável $OPTARG.
Dessa maneira, podemos executar esse programa de diversas formas:
./tmp.sh -o arquivo.log -u
(executa o "uname -a" e grava no arquivo arquivo.log)
 
./tmp.sh -um
(executa os comandos "uname -a" e "free -m")
 
./tmp.sh -m -s -u
(executa os comandos "free -m", "swapon -s" e "uname -a")
Ou seja, não importa a ordem, o getopts vai reconhecer e executar as ações de acordo com a opção especificada.
E se você colocar uma opção que não está contemplatada… O “?” do case irá ser executado, por exemplo:
$ ./tmp.sh -a
./tmp.sh: illegal option -- a
Uso: tmp.sh <-umsf> [-ohv]
E dessa forma fica bem fácil de entender e usar o getopts :) Depois que o laço é todo feito e executado em todos os argumentos (no meu caso, preferi apenas configurar variáveis para cada opção e tratá-las depois), ele executa o comando que está na linha 28:
?
1
shift $((OPTIND-1))
Este comando faz com que os argumentos de opções sejam “comidos“, até que não sobre nenhuma opção. Em outras palavras, os argumentos representados pelas variáveis $N só serão aqueles que não pertençam a nenhuma opção. Exemplo:
./tmp.sh -u -o arquivo.log -m argumento1 argumento2
Nesse caso, o $1 seria o argumento1 e o $2 seria o argumento2, quando na verdade, sem o shift, eles seriam respectivamente o $5 e $6.
Como nem tudo é perfeito, a função getopts do bash não aceita opções longas (–nome-da-opcao), ou seja, voce só pode utilizar uma letra como opção. Represente bem suas opções com as letras! :)

Argumentos dentro de funções

Se dentro de um shell-script temos uma função, essa função é enxergada pela shell como se fosse um comando. Nesse sentido, dentro de uma função as variáveis $N definidas pelo programa não funcionarão. Exemplo:
?
01
02
03
04
05
06
07
08
09
10
11
12
13
#!/bin/bash
 
function Dummy() {
   echo "Numero de argumentos: $#"
 
   COUNT=0
   for ARG in $*; do
      COUNT=`expr $COUNT + 1`
      echo "Argumento $COUNT: $ARG"
   done
}
 
Dummy
Não importa o que você executar com o script acima, a saída será sempre a mesma: 0 números de argumentos, como mostrado a seguir.
$ ./tmp.sh
Numero de argumentos: 0
 
$ ./tmp.sh naosei temporario
Numero de argumentos: 0
 
$ ./tmp.sh a b c d e f g
Numero de argumentos: 0
Para a função Dummy, as variáveis especiais dos argumentos funcionam apenas para a função e não para o programa inteiro. É como se as variáveis fossem locais, e não globais. Vamos então substituir a linha da chamada da função Dummy (linha 13) por:
?
1
Dummy a b c d
E tentar executar novamente:
$ ./tmp.sh
Numero de argumentos: 4
Argumento 1: a
Argumento 2: b
Argumento 3: c
Argumento 4: d
Sabendo disso, não se percam na hora de usar os argumentos dentro das funções e lembrem-se que isto pode ser útil na hora de implementar diversas funções dentro de um script. Um bom exemplo disso é implementar a função PrintUsage que usamos anteriormente para, além de mostrar uma mensagem de uso, mostrar também uma mensagem de erro personalizada:
?
1
2
3
4
5
function PrintUsage() {
   [ "$1" ] && echo -ne "Erro: $1\n"
   echo "Uso: $(basename $0)  <-umsf> [-ohv]"
   exit 1
}
Agora é so chamar a função como…
PrintUsage "Faltando parâmetros."
PrintUsage "Opção inválida."
PrintUsage "No donut for you."
Use a criatividade de um programador (afinal, programação é arte) e comece a aprimorar suas ferramentas bash! :)

Fonte: http://www.devin.com.br/shell-script-tratamento-de-argumentos-e-opcoes/
Continue reading →
quinta-feira, 2 de maio de 2019

SSH – Conexão sem senha: Windows

0 comentários
No post anterior, ensinei como acessar um servidor SSH no Linux sem ter que digitar senha, neste ensinarei a fazer a mesma coisa, porém utilizando uma ferramenta Windows, o meu grande amigo Putty (Cliente para conexões SSH e muito mais) e como na dica anterior usaremos o usuário joao_servidor para teste.
Nesta dica, vamos utilizar duas ferramentas bem leves, o Putty (Para fazer a conexão) e o PuttyGen (Para gerar as chaves).
O primeiro passo, é gerar as nossas chaves usando o PuttyGen, quando executa-lo, será apresentado uma janela semelhante a esta:

Clique em Generate para iniciar a geração da chave e depois fiquei movimentando o mouse sobre o campo Key, pois a criação da chave será baseada na posição dele:
Após gerar a chave, em Key Comment você pode adicionar um cometário, geralmente coloco o meu Email e em Key passfrase você pode adicionar uma senha a sua chave, porém toda vez que for se conectar ao servidor será necessário digitar esta senha.
Para salvar a chave publica, você pode clicar em Save public key, mas eu prefiro copiar o código gerado em Public key for pasting into OpenSSH authorized_keys file e colar em um novo documento de texto, assim quando precisar da chave, basta copiar o código novamente.
Para salvar a chave privada, clique em Save private key, escolha o local e o nome do arquivo e clique em Salvar, lembrando que este arquivo deve ficar muito bem guardado para que ninguem tenha acesso, pois quem tiver acesso a este arquivo poderá logar no servidor tranquilamente.
Obs: Caso não tenha digitado nenhuma passphrase, você será questionado se realmente deseja salvar a chave sem nenhuma proteção, basta clicar em Sim.


Pronto, agora que temos o par de chaves, vamos configurar o servidor:
Acesse o servidor normalmente via ssh e já conectado vamos verificar se o diretório .ssh (o ” . ” indica que é um diretório oculto) ja existe, caso não, basta cria-la com o seguinte comando:
# mkdir /home/joao_servidor/.ssh
Agora vamos entrar no diretório:
# cd /home/joao_servidor/.ssh
E editar o aquivo authorized_keys:
Obs: Caso não exista, basta criar.
# pico authorized_keys
Obs: Certifique-se que o arquivo está no diretório /home/joao_servidor/.ssh
Devemos adicionar a chave que copiamos do PuttyGen ao final do arquivo. Depois de adicionar, basta salvar e sair, agora você pode desconectar do servidor.
O ultimo passo é editarmos o putty para que o mesmo consiga trocar as chaves com o servidor, para isso abra o putty, será exibido uma janela semelhante a essa:
No campo Host Name digite o nome do servidor ou o IP e em Port digite a porta usada pelo SSH (Padrão 22). Preencha o campo Saved Sessions com o nome que queira dar ao seu servidor e clique em Save. Note que abaixo de Default Settings ficou o seu servidor.
Depois, em Category clique em Data e no campo Auto-login username digite o usuário que deseja utilizar para login.
Logo abaixo clique em SSH, depois em Auth. No campo Private key file for authentication clique em Browse e selecione sua chave Privada.
Volte ao menu Session e clique novamente em Save para salvar as configurações e depois clique em Open.






  Pronto, agora todas as vezes que quiser conectar ao servidor, basta abrir o putty e clicar duas vezes sobre o nome do seu servidor que você conectará a ele sem ter que digitar senha.
Como disse no post passado, devemos tomar muito cuidado com qual usuário conectamos, pois acessos errados a pessoas erradas podem causar muita dor de cabeça. NUNCA utilize esse método de autenticação com o usuário root, pois se alguém mal intencionado tiver acesso a chave privada, você estará “lascado”.
Uma boa dica de segurança, é depois de testar a autenticação por chaves, desabilitar o acesso de root via SSH e desabilitar também o acesso com senha, assim você somente conseguirá acessar o servidor com a sua chave.
Testado no Windows 7 / Putty
 
Precisa de Suporte Técnico ou Consultoria? www.revolutech.com.br
Gostou? Compartilhe, deixe seu comentário. Receba o conteúdo do blog em seu Email clicando aqui.
Achou algum erro? Precisa de ajuda? Criticas?  Deixe seu comentário.
Obrigado!
 
Fonte: https://vidadeti.com/ssh-conexao-sem-senha-windows/
Continue reading →
quarta-feira, 1 de maio de 2019

Como descobrir as versões do .NET Framework instaladas

0 comentários

Como descobrir as versões do .NET Framework instaladas

Publicidade
Vários programas exigem versões específicas do .NET Framework para rodarem e infelizmente a Microsoft não oferece uma maneira fácil de você verificar quais versões do .NET Framework estão instaladas no PC.
Nesse tutorial vamos mostrar quatro maneiras diferentes de você verificar rapidamente quais as versões do .NET Framework você tem instaladas em seu computador com Windows 7, Windows 8/ 8.1 e Windows 10.
Publicidade

Opção 1 – Windows Explorer

Uma forma simples de descobrir as versões do .NET Framework instaladas é através do Windows Explorer.
1. Pressione “Win+R” para abrir o Executar, digite o comando abaixo e pressione “Enter” ou simplesmente abra uma nova janela do Windows Explorer e navegue até a pasta C:\Windows\Microsoft.NET\Framework.
%windir%\Microsoft.NET\Framework\
2. Nesse local você verá pastas com as versões do .NET Framework instaladas no Windows.
3. Você também pode verificar a pasta abaixo se estiver usando a versão de 64 bits do Windows.
C:\Windows\Microsoft.NET\Framework64

Opção 2 – Linha de comando

Outra maneira muito prática de você descobrir quais versões do .NET Framework estão instaladas em seu computador é através de um comando, executado no PowerShell ou no Prompt de Comando do Windows.
1. Pesquise por PowerShell no menu iniciar e abra o “Windows Powershell”
2. Copie o comando abaixo, cole no Powershell e pressione “Enter”.
wmic product get description | findstr /C:.NET
3. Aguarde um pouco e ele retornará a lista de versões do .NET Framework instaladas em seu computador.
4. É possível também usar o Prompt de Comando, basta digitar o comando abaixo no Prompt e aguardar.
wmic product where "Name like 'Microsoft .Net%'" get Name, Version
Continue reading →