shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Msg para celular


From: Felipe Kellermann
Subject: Re: [shell-script] Msg para celular
Date: Wed, 17 Sep 2003 22:29:50 -0300 (BRT)

On Tue, 16 Sep 2003 11:00pm  -0700, moysespr wrote:

> Inclusive, estou no momento brincando de "browser shell" para coleta
> e envio de dados (GET e POST), coisa que normalmente seria feita com
> o lynx, só que assim SHELLzeiro faz do seu jeito e sem por a mão em
> C.

        Oi! Há uns dias vi uma pergunta em uma lista e pensei que poderia
escrever apenas um rabisco da idéia, porque é útil -- a idéia é fazer um
pequeno "tail remoto". Pode ser feito de diversas formas, mas um rabisco
que fiz em shell talvez possa ajudar nas tuas brincadeiras! :-) De fato,
fazer de outras formas poderia ser mais rápido e lógico, mas a idéia era
usar http para fazer as requisições: pensei em usar algumas features do
protocolo e ver como ficaria e ficou assim:

#!/bin/sh
#fk'rtail
[ "$1" ] && while :; do
        exec 3<>/dev/${tu:-tcp}/${2:-127.1}/${rp:-80} && {
        s=$(du -b ${1##*/}|tr \\t :) && s="\nRange: bytes=${s%%:*}-"
        echo "GET /$1 HTTP/1.0$s\n\n" >&3
        sed 0,/^.$/d <&3; } && sleep ${3:-5}
done || echo ${0##*/} arq [end] [tem]

        Exemplo, pegando um pedaço de um log:

$ rtail mesg|tee -a mesg
dkcsum: wd0 matched BIOS disk 80
root on wd0a
^C
$ echo $BASH_VERSION
2.05b.0(1)-release

        A idéia é simples: Verificamos o arquivo local. Se ele ainda não
existe, nós vamos pegar do início ao fim. Mas se já existe, então vamos
verificar o quanto nós já temos dele e vamos pegar apenas o que falta, e
continuamos. O protocolo padrão é tcp, o endereço padrão é o local, porta
padrão é 80 e o tempo padrão é 5 segundos. Recomendaria que tanto o while
quanto o sleep fossem usados apenas externamente. E também é recomendável
que se faça algum túnel para o "tail remoto" seguro! :-) Como uma última
dica, apenas para lembrar: para analisar e atualizar ao mesmo tempo, pode
ser interessante, como uma das opções, usar o `tee' com a opção '-a' como
no exemplo anterior: Se não atualizar e não usar nenhum cache, todas vezes
que as informações forem atualizadas vai ser mostrado tudo o que não está
no arquivo local, repetindo. Se houver necessidade de autenticação, basta
adicionar as informações à 's', o servidor vai responder aos pedidos! :-)

        Observações: Note que o `echo' do coreutils precisa usar uma opção
para reconhecer os caracteres especiais: -e, o que não é interessante. E
note também que a opção -b do `du' não é uma opção padrão, é uma extensão
de aplicativo GNU. Pode trocar pelo wc, usando a opção -c. Como uma última
observação: Neste caso nós fazemos uma requisição e pegamos um resultado,
e isto significa que poderia ser mais simples usar algum aplicativo como
auxílio, como netcat ou socket, que fica mais rápido e vai funcionar, não
precisamos criar named-pipes e conseguimos resolver em uma única linha e,
principalmente: Vai funcionar em qualquer shell! E esta opção dos devices
especiais da bash é, infelizmente, unicamente dela -- e às vezes a bash
ainda é distribuída sem suporte aos devices, apesar de ser uma opção que
fica marcada como padrão na montagem do código original.

        Mas a bash não suporta co-processos (ou, eu que não percebi alguma
forma de fazer a mesma coisa com a mesma praticidade). Então, veja como eu
costumo usar o mesmo programa (note que praticamente não há modificações):

#!/bin/sh
#fk'rtail
[ "$1" ] && while :; do
        socket $2 ${rp:-80} |& echo -n >&p && {
        s=$(du -b ${1##*/}|tr \\t :) && s="\nRange: bytes=${s%%:*}-"
        echo "GET /$1 HTTP/1.0$s\n\n" >&p
        sed 0,/^.$/d <&p; } && sleep ${3:-5}
done || echo ${0##*/} arq [end] [tem]
$ rtail mesg
rootdev=0x0 rrootdev=0x300 rawdev=0x302
^C
$ echo $KSH_VERSION
@(#)PD KSH v5.2.14 99/07/13.2

        Ou seja: A melhor saída é usar os dois tipos no mesmo programa e
fazer um teste para ver qual vai ser usado, na minha opinião. E ainda como
uma opinião pessoal (para não gerar problema com opiniões divergentes), eu
acho que um dos dois casos sempre vai estar disponível, já que são idéias
de mais ou menos uma década atrás. Então, para fazer este teu mail-fetch,
seria uma idéia testar se é possível usar os devices. Não sendo possível,
tentar usar co-processos, e por aí vai.

        E uma coisa que fiz há um tempo foi um pequeno shell para usar um
sistema de bibliotecas que é muito usado em universidades, o 'Aleph' -- e
ele tem uma 'interface web' também! Mas depois modifiquei muito o que já
tinha feito porque pensei em fazer uma definição para usar apenas como um
suporte para ficar mais livre no sistema: Por exemplo, para renovar livros
na shell: `autentica && for i in $(reservados); do renova $i; done'. Mas
vai ficar para acabar depois! :-) Então, um ótimo divertimento e qualquer
dúvida ou idéia sobre o assunto ou os exemplos, só falar. Até mais,

-- 
Felipe Kellermann


reply via email to

[Prev in Thread] Current Thread [Next in Thread]