Algumas vezes precisamos criar usuários e/ou grupos de sistema, os quais geralmente são IDs abaixo de 1000 para serem usuários de serviços. Abaixo vai o código fonte e exemplos de uso.#!/bin/bash # nextsysid.sh # Script para gerar o próximo ID de sistema vago # Elaborado por Juliano Atanazio # 17/04/2011 if [ -f /etc/adduser.conf ]; then source /etc/adduser.conf # Faz a leitura do arquivo onde contém variáveis sobre # quais devem ser os últimos IDs de usuários e grupos # Obs.: Debian e derivados else # Para Red Hat e derivados FIRST_SYSTEM_UID='1' LAST_SYSTEM_UID='499' FIRST_SYSTEM_GID='1' LAST_SYSTEM_GID='499' fi case $1 in # Opção para o próximo ID de usuário de sistema 'user') # Primeiro ID de usuário de sistema ID_MIN=$FIRST_SYSTEM_UID # Último ID de usuário de sistema ID_MAX=$LAST_SYSTEM_UID; # Arquivo de IDs para usuários FILE='/etc/passwd'; ;; # Opção para o próximo ID de grupo de sistema 'group') # Primeiro ID de grupo de sistema ID_MIN=$FIRST_SYSTEM_GID # Último ID de grupo de sistema ID_MAX=$LAST_SYSTEM_GID; # Arquivo de IDs para grupos FILE='/etc/group'; ;; *) # Exibe mensagem sobre parâmetros corretos echo -e "$0 {user|group}"; exit 1; ;; esac # ----- Extrai todos IDs de sistema do arquivo ----- IDs=$(cat $FILE | cut -f3 -d: | sort -n ) SYS_IDs="" for ID in $IDs; do if [ $ID -ge $ID_MIN ] && [ $ID -le $ID_MAX ]; then SYS_IDs="$SYS_IDs $ID" fi done # ----- Extrai o próximo ID vago de sistema ----- i=$ID_MIN NEXT_ID=$(($ID_MIN+1)) for SYS_ID in $SYS_IDs; do if [ $SYS_ID -ne $i ]; then break; fi let i++; NEXT_ID=$i done # Imprime na tela o próximo ID echo $NEXT_IDSalve o arquivo com o nome nextsysid.sh e dê a permissão de execução: chmod +x nextsysid.sh Exemplos de Uso Próximo ID disponível para usuário de sistema ./nextsysid.sh user 114 Próximo ID disponível para grupo de sistema ./nextsysid.sh group 126 Até a próxima dica!!!![]()
nextsysid.sh: Shell Script para Determinar o Próximo ID de Sistema
abril 17, 2011AUTO INCREMENTO E PREENCHIMENTO COM ZEROS À ESQUERDA NO ORACLE
outubro 30, 2010A Idéia
No MySQL há dois recursos muito interessantes que são o AUTO_INCREMENT e o ZEROFILL.
O AUTO_INCREMENT que como o próprio nome sugere, incrementa automaticamente a cada INSERT. Esse recurso também está disponível no PostgreSQL (serial) e no MS SQL Server (identity).
Já o ZEROFILL, preenche com zeros à esquerda. Algo do tipo: 27 -> 00027.
No Oracle
No Oracle essas coisas, lógico, também são possíveis. Mas darão um pouco mais de trabalho.
Vamos construir um exemplo em que, numa tabela de funcionarios há um campo chamado id_funcionario, o qual é a matrícula de um colaborador contendo 5 dígitos, e, em casos que o número de dígitos seja inferior a 5, será preenchido com zeros, por exemplo: 00352. E também esse número será incrementado a cada
INSERT para fazermos o “AUTO_INCREMENT”.
Criação da tabela
CREATE TABLE tb_funcionarios(
id_funcionario CHAR(5),
nome_funcionario VARCHAR(30),
CONSTRAINT pk_funcionario PRIMARY KEY (id_funcionario)
);
Até então nada de muito especial, talvez o fato do campo de identificação ser CHAR e não INT… A resposta pra isso é muito simples; ninguém soma matrículas
SEQUENCES – Criando uma sequência
São Objetos que armazenam sequências numéricas:
CREATE SEQUENCE sq_funcionario START WITH 1 INCREMENT BY 1 NOMAXVALUE;
Relacionando a Sequência com a Tabela através de um Gatilho
CREATE OR REPLACE TRIGGER tg_id_funcionario BEFORE INSERT ON tb_funcionarios
FOR EACH ROW
BEGIN
SELECT lpad(sq_funcionario.nextval,5,’0′) INTO :NEW.id_funcionario FROM DUAL;
END;
A Função lpad
No Oracle, qualquer consulta necessita de um “FROM” para poder funcionar, então foi usada a tabela DUAL (para maiores informações procure no SQL Reference por “Selecting from the DUAL Table”).
A função “lpad” no caso teve três parâmetros respectivamente: o número, quantidade de dígitos e caractere para preencher à esquerda. Veja um exemplo prático:
SELECT lpad(352,5,’0′) FROM DUAL;
Retornou: 00352
E por fim, vamos inserir algumas coisas na tabela para testar
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Chiquinho da Silva’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Astrogilda Santos’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Estroncio Veiga’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Wolframia Costa’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Teobaldo Castro’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Equinocia Tavares’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Gisevalda Almeida’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Gioconda Ramires’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Berília Rocha’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Adergildo Sales’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Criptonio Dias’);
INSERT INTO tb_funcionarios (nome_funcionario) VALUES (‘Rubidio Jose’);
Obs.: Nomes fictícios, qualquer semelhança com a realidade é mera coincidência
O resultado
SELECT * FROM tb_funcionarios;
Conclusão
O resultado final foi obtido através de relacionamento entre objetos, no qual um gatilho (TRIGGER) é acionado quando um INSERT é feito na tabela e
faz com que o valor inserido para o campo “id_funcionario” seja automaticamente incrementado, pegando o próximo número da sequência e o preenchendo com zeros à esquerda.
Configuração Manual do Ambiente JDK no Ubuntu + Plugin Java para Mozilla
julho 16, 2010Um pequeno tutorial para ajudar a configurar o ambiente Java para programação de forma mais flexível, sem depender do apt-get. Além de configurar o plugin Java para navegadores como Firefox, Google Chrome, Opera, Konqueror, etc…
De início, temos que baixar o JDK no site:
http://java.sun.com/products/archive/index.html
Passos do site:
JDK/JRE – 6 -> [ Escolha a última versão ] -> Go
Download JDK -> Plataform: [ "Linux x64" para sistemas de 64 bits e "Linux" para 32 ] -> Continue
jdk-[versão].bin (não pode ser rpm.bin!) -> Salve em /tmp
Configurações e comandos
Abra um terminal e dê os comandos:
cd /tmp
chmod +x jdk-*.bin # Torna o arquivo executavel
./jdk-[versão].bin # Roda o executável
[ Pressione "q" a não ser que queira ler todo o texto
] -> [ Escreva "yes" (sem as aspas) ] -> <Enter>
mv jdk1* jdk # Deixa um nome mais amigavel
sudo mv jdk /opt/ # Move o diretorio jdk para /opt
Para sistemas de 64 bits:
# Cria um link para o plugin Java para Mozilla
sudo ln -s /opt/jdk/jre/lib/amd64/libnpjp2.so /usr/lib/mozilla/plugins/
Para sistemas de 32 bits:
# Cria um link para o plugin Java para Mozilla
sudo ln -s /opt/jdk/jre/lib/i386/libnpjp2.so /usr/lib/mozilla/plugins/
Edite o arquivo /etc/bash.bashrc e adicione as seguintes linhas:
export JAVA_HOME=‘/opt/jdk‘
export JRE_HOME=‘/opt/jdk/jre‘
export CLASSPATH=‘.:/opt/jdk/jre/lib‘
export PATH=“$PATH:$JAVA_HOME/bin:$JRE_HOME/bin“
Se for programar apenas em modo texto, no shell (haja coragem!!!), basta executar:
source /etc/bash.bashrc
Ou então para poder usufruir plenamente, simplesmente encerre a sessão na qual seu usuário está logado e entre novamente.
Pode ser que ao instalar via apt-get algum programa que necessite do jdk ele venha instalar automaticamente coisas como openjdk, icedtea que mais atrapalham do que ajudam. Então será preciso remover esses pacotes (indesejados) com o comando apt-get –purge remove nome_do_pacote. Uma boa maneira para se verificar se existem tais pacotes é fazendo uma busca com o comando:
dpkg -l | egrep “(jdk|java|icedtea)”
Se for o caso, desinstale o que não interessar para evitar conflitos com a instalação manual.
Agora o ambiente está pronto! É só começar a programar!
PostgreSQL com “ZEROFILL” e “AUTO_INCREMENT”
março 20, 2010Este artigo é dirigido especialmente àqueles que vêm do MySQL para o Postgres.
Dois recursos interessantes que existem no MySQL, o ZEROFILL (preenchimento com zeros à esquerda) e o AUTO_INCREMENT (incremento automático).
Como fazer o AUTO_INCREMENT no PostgreSQL
O recurso de auto incremento no Postgres é feito através de SEQUENCES (sequências), que é um tipo de objeto que armazena sequências.
Em um exemplo mais simples criamos a tabela sem criar a SEQUENCE explicitamente. A palavra chave SERIAL, na verdade é o tipo INTEGER e faz com que uma sequência seja criada implicitamente para o campo:
CREATE TABLE tb_teste(
id SERIAL PRIMARY KEY
);
Dentre as mensagens exibidas após o comando acima, destaca-se:
NOTICE: CREATE TABLE will create implicit sequence “tb_teste_id_seq” for serial column “tb_teste.id”
Vejamos a descrição da tabela:
\d tb_teste
Table “public.tb_teste”
column | Type | Modifiers
——–+———+——————————————————-
id | integer | not null default nextval(‘tb_teste_id_seq’::regclass)
Indexes:
“tb_teste_pkey” PRIMARY KEY, btree (id)
Como podemos ver, não existe “mágica” e sim LÓGICA!
-> Se quiser um auto incremento, tem que ter uma sequência, a qual é o valor padrão do campo ao qual está associada, nem que seja criada implicitamente.
Criação de uma Sequência
Incrementa com razão = 1 (lembre-se das aulas de progressão aritimética
), valor mínimo = 0, valor máximo = 99999:
CREATE SEQUENCE sq_exemplo INCREMENT 1 MINVALUE 0 MAXVALUE 99999;
Enfim, o ZEROFILL
Criação da Tabela
CREATE TABLE tb_exemplo(
id CHAR(5) DEFAULT lpad(nextval(‘sq_exemplo’)::CHAR(5),5,’0′) PRIMARY KEY
);
Repare que desta vez houve a mensagem de criação de sequência implícita. Isso porque a mesma foi criada explicitamente.
E onde está o EFEITO ESPECIAL?
1 – A restrição DEFAULT, que atribui um valor padrão ao campo;
2 – A função nextval que retorna o próximo valor da sequência, sua sintaxe é: nextval(‘nome_da_sequence’);
3 – A função lpad que recebe aqui três parâmetros: text, integer e text.
No primeiro parâmetro, nextval(‘sq_exemplo’)::CHAR(5), como a função nextval retorna um integer, foi preciso converter para um formato texto, que no caso foi CHAR(5).
No segundo parâmetro, 5 é o tamanho máximo da string que será preenchida com zeros à esquerda.
E no terceiro parâmetro, ’0′, é o caractere que será usado para preencher à esquerda caso de a string (primeiro parâmetro) for menor que o tamanho máximo (segundo parâmetro).
Teste e Conclusão
INSERT INTO tb_exemplo VALUES (DEFAULT),(DEFAULT),(DEFAULT),(DEFAULT),(DEFAULT);
O comando acima é um INSERT múltiplo na tabela que só tem um campo e que o mesmo possui um valor padrão (DEFAULT) e esse valor é o próximo numero da sequência, com preenchimento de zeros à esquerda.
Agora vejamos o resultado:
SELECT * from tb_exemplo ;
id
——-
00000
00001
00002
00003
00004
00005
(6 rows)
Vale a pena repetir os testes para ver os valores inseridos.
Enfim, confie no poder do grande elefante e tome suas rédeas para dominá-lo XD.
Concedendo ou Revogando Privilégios em Colunas
dezembro 15, 2009Antes da versão 8.4 só era possível fazer o controle de acesso de forma mais granular a uma tabela criando uma view especificando as colunas permitidas.
Agora pode dar ou tirar privilégios da seguinte forma:
GRANT SELECT (coluna1,coluna2,…) ON tabela TO role;
Para o exemplo prático a criação de role:
CREATE ROLE limitado LOGIN NOSUPERUSER;
Só terá acesso às colunas campoX e campoY, sendo de somente leitura da tabela tb_exemplo:
GRANT SELECT (campoX,campoY) ON tb_exemplo TO limitado;
De forma análoga será revogado (retirado) o acesso à coluna “campoX”:
REVOKE SELECT (campoX) ON tb_exemplo FROM limitado;
PostgreSQL – Função Replace: Corrigindo Inserções Equivocadas
dezembro 4, 2009Imaginemos uma situação em que uma pessoa encarregada de cadastrar nomes de pessoas em um banco de dados. E que essa pessoa por algum motivo acabava confundindo os sobrenomes “dos Santos” e “da Silva”.
No exemplo, o cadastro das pessoas que constam como “da Silva”, na verdade o sobrenome é “dos Santos”. Como corrigir isso??? Fazer um UPDATE em cada linha? Há uma maneira simples, rápida e eficiente para isso:
–Criação da Tabela de exemplo:
CREATE TEMP TABLE tb1(
nome varchar(25)
);
–Inserção dos valores (equivocadamente):
INSERT INTO tb1 VALUES (‘Genésio Silva’),
(‘Estrobaldo da Silva’),
(‘Aventina Silva’),
(‘Eloécio da Silva’);
–Arrumando o erro:
UPDATE tb1 SET nome = replace(nome,’da Silva’,'dos Santos’);
–Verificando o resultado:
SELECT * from tb1 ;
nome
———————–
Genésio Silva
Estrobaldo dos Santos
Aventina Silva
Eloécio dos Santos
(4 rows)
Como pode se constatar apenas as ocorrências da string “da Silva” e não “Silva” foram alteradas para o novo valor.
Consulta aleatória com PostgreSQL
agosto 13, 2009Ao invés de apresentarmos resultados de uma consulta de forma ordenada, pode ser interessante apresentá-los sem uma ordem específica. Uma forma aleatória.
No PostgreSQL temos a função random() que nos ajudará para isso.
Exemplo:
SELECT campo1,campo2,campoN FROM tabela WHERE campo1=’valor’ ORDER BY random() LIMIT 5;
De acordo com o exemplo, conforme a condição de filtragem, os resultados serão apresentados em 5 (cinco) por vez e de forma aleatória.
Atualizando a hora do Windows por um Servidor Linux NTP
junho 24, 2009Com as devidas permissões de usuário, no prompt DOS digite os comandos:
net time /setsntp:ip_do_serrvidor_NTP
net stop w32time
net start w32time
Aguarde alguns segundos e terá o horário atualizdo!
Gerando senhas com o pwgen
dezembro 27, 2008Política de senhas é algo que todo administrador de redes deve se preocupar, mas, muitas vezes se deparam num pequeno problema:
o de elaborá-las… Como fazer isso? De cabeça? Data de aniversário, casamento ou uma outra qualquer? Para um cracker que possui a habilidade de engenharia social descobrir uma senha dessas é razoavelmente fácil.
Até conhecer o pwgen, eu mesmo pra elaborar minhas senhas queimava alguns neurônios pensando em seqüências de caracteres “doidas”, como diziam aqueles para quem as entregava (risos).
No entanto, a partir do momento que conheci o pequeno utilitário pwgen as coisas mudaram e facilitaram pra mim nesse assunto.
Vamos primeiro instalar o utilitário:
sudo apt-get install pwgen
Fiz uma tradução de seu help (pwgen –help):
Opções suportadas pelo pwgen:
-c ou --capitalize
Inclui no mínimo uma letra maiúscula na senha
-A ou --no-capitalize
Não inclui letras maiúsculas na senha
-n ou --numerals
Inclui no mínimo um número na senha
-0 ou --no-numerals
Não inclui números na senha
-y ou --symbols
Inclui no mímino um carácter especial na senha
-s ou --secure
Gera senhas completamente aleatórias
-B ou --ambiguous
Não inclui caracteres ambíguos na senha
-h ou --help
Exibe ajuda do comando
-H ou --sha1=path/to/file[#seed]
Use hash sha1 de um dado arquivo como gerador aleatório
-C
Exibe as senhas geradas em colunas
-1
Não exibe as senhas geradas em colunas
-v ou --no-vowels
Não utiliza vogais nas senhas
Se for simplesmnete digitado o nome do executável teremos um resultado como o que segue abaixo:
Thietho3 lahC7yoV oox3Asah fohch4Ej ooChoi7e ileeCae3 oMai8ui7 feV2cahk
ew1Quomu teshou1U FaoNo9oh irooMei1 SheiGh5h chu7Chee eiDei0oh Ojie7eik
Keegieb5 pu7aiGae Poh8quae Ti0poo5v Ahkoo0Ee uCh4thie deiCh2aC chax6Hoh
omaid8aP eeTh6oob Ooch4iwe Ur2ochai Ahgh2Chu thae4Nei ahPha9oo Xiaraiy8
iePh5mi4 Sexoh1Ge faequ9Oh HeN3aNg3 eew8EiYo zohVoh5p foo2DiiV ouKen0ma
shiec0Re haenohW4 aetha4eP Gai1aiTh iwie2Kai ga0gaeH8 Uih3mahs oqu8Iaha
neiF0eir xaoXui7X Doha6iGh jui2eeKu vaRohr6t eL1uhazu aijoh1Ee AiX9eeba
Ahgh1Jee loozu8Ev ThauTil1 Gai6aePo vee5Gee9 ahSh6Nur Zohk1ubi ieX1tigu
Ii5eiToh DahDeev1 foiDoh1W aiH4Iu7W Eech7dae xoe8aQuo quuiT2ae ohVie8ib
baePhu9O ahNgee8Z Fui9gohb Thea8soo Shee0fie Ma0choem ohco7aKa ieng2ohH
ECeel2Io saer8Vei Cho7thah aGh3aite AhXoof7i pig5Sho3 Fa8Wiah1 deW0raiz
Ephia2de Eemah7ai eeX5ohti ve5Xiezo texu5IGh ReiGh7Mo aeCh3shu ool8Diul
ooCh5umi kuKaup7b iet4Xa9l Achangi5 Gahxeix9 eech5AhV aThahsi0 Raik3nae
ahGu0Oof uiNgoh6i aGae9kaf eewe2Tha Tai9oPhe ve3Uphoo JaeQuai2 SohF2wai
jom8ooTh KeyeeZ0X cee0FaeN Xait1soo EiSoo1ae leeCaej8 fuf0Pafu iPhie7wi
faeGith4 Phaf0duy oGu5ifuy uRae1Zai Wiet7EeC eem9Viep Deepoo6i Pug8aing
Thae4ahb Gaiqu3Ga aixi2Uwa The6aepa hom8Iexe oozaGu5n quohg1Ie Jieyae5b
Tu2Ietho Pai9zeSh yeeShae7 chew8Gah Ohr0eefo ookoBe8w eol1yaK9 achuoS1x
nai8Aith ang6Oozi Touy1ail Opha7phu Ri7Eepha oSi3Oora ahpee3Eh Heehi8ee
Quoh8tha Ohshae6h eeNg7Ies ooV9Eich OCe2rooc bie6Liez eeReiy9h Ovus6iej
Vale lembrar que as senhas são aleatórias, a probabilidade de elas se repetirem são realmente ínfimas.
Para não ficar uma demonstração poluída, que exibe várias senhas geradas em colunas, usarei a opção “-1″
para exibir apenas uma senha. Então vejamos:
pwgen -1
toej3ahL
Por padrão mistura letras (maiúsculas e minúsculas) e números, mas não inclui caracteres especiais.
Para fazermos uma senha mais segura, vamos acrescentar um “y” como parâmetro para gerar uma senha mais difícil ainda de ser adivinhada:
pwgen -1y
Sie)th7U
Agora temos uma senha q possui letras (maíusculas e minúsculas), números e caracteres especiais.
O uso do pwgen é bem simples, as opções são auto explicativas por si só e vale lembrar que cada senha que o aplicativo gera tem 8 (oito) caracteres, determinados sistemas exigem mais que isso. A solução é bem simples, complemente o que falta gerando outra senha e junte-as.
O pwgen é a ferramenta ideal para gerar senhas, simples, prático e agilizador. Eu recomendo!
Impressão lpr e Adobe Reader (problema resolvido!)
dezembro 18, 2008Durante muito tempo fazia as coisas tudo na mão no Linux, pois eu usava o Slackware…
Mas com o passar do tempo fui ficando cada vez mais atarefado e por questão de comodidade troquei o Slackware pelo Ubuntu.
Recentemente resolvi reinstalar o sistema em minha máquina, mas não usei o CD de instalação do Ubuntu Desktop e sim do Ubuntu Server.
Queria algo mais enxuto e mais personalizável para poder tirar mais desempenho da máquina. Para isso fiz a instalação mínima. Muita coisa refiz na raça mesmo. Porém, acabei me deparando com alguns problemas que me vi obrigado a resolver, alguns irritantes… O que acho q merece um destaque é esse do título. Eu simplesmente não consegui imprimir um arquivo PDF no acroread (Adobe Reader).
A mensagem exibida após a ordem de impressão de arquivo:
the following error occured while printing...
`usage: lpr [-cdfghlmnpqrst][-#num][-1234 font][ -C class][-i [numcols]]
[-j job][-Pprinter][-T title][-U user][-wnum][-name...]'
Solução encontrada depois de uma boa “googleada”: Instalar um pacote chamado cups-bsd
Dê o comando:
sudo apt-get install cups-bsd
O pacote lpr original será excluído e os executáveis do cups-bsd terão os mesmos nomes, e então os trabalhos de impressão serão enviados pelo CUPS.
Pronto!
Problema resolvido!