Como posso verificar as mensagens do Gmail com a solicitação de senha de um script?

4

Estou usando o zsh no Ubuntu 14.04 sobre o SSH usando o Putty e estou configurando as combinações de teclas do meu teclado. Como o zsh não parece utilizar minhas teclas de função, eu pensei em configurar scripts para executar operações semelhantes às representadas pelas imagens nas teclas. Estou trabalhando no botão de e-mail e estou trabalhando muito bem, mas gostaria que fosse melhor. Isso é o que eu tenho em ~/.zshrc :

# Ensure we are in emacs mode
bindkey -e

# This requires you to enable the ATOM feed in Gmail. If you don't know what that is then
# go ahead and try this and let it fail. There will then be a message in your inbox you
# can read with instruction on how to enable it. Username below should be replaced with 
# your email id (the portion of your email before the @ sign).
_check-gmail() {
    echo
    curl -u username:password --silent "https://mail.google.com/mail/feed/atom" | tr -d '\n' | awk -F '<entry>' '{for (i=2; i<=NF; i++) {print $i}}' | sed -n "s/<title>\(.*\)<\/title.*name>\(.*\)<\/name>.*/ - /p"
    echo
    exit
}
zle -N _check-gmail


# F2 - Display Unread Email
bindkey "^[[12~" _check-gmail

Quando usado como acima, funciona. Estou tendo dois problemas.

Antes de mais nada, eu preferiria que ele me pedisse uma senha em vez de deixá-la no script desse jeito. Isso pode ser feito facilmente removendo :password do comando curl na linha de comando, mas quando usado dentro deste arquivo, causa problemas. Especificamente, parece aceitar o primeiro pressionamento de tecla, mas o restante cai para outro shell que não é a entrada de senha.

Em segundo lugar, a primeira vez que eu executo isso em um shell funciona perfeito. Depois disso, ele não retorna ao prompt corretamente. Eu preciso pressionar Enter para obter outro prompt. Existe uma maneira de corrigir isso?

Eu coloquei a seção de atalhos de teclado completa do meu arquivo .zshrc no GitHub .

    
por krowe 22.08.2014 / 14:51

2 respostas

3

O problema é que curl espera algumas configurações normais do terminal e zle não espera que você altere as configurações do terminal. Então você pode escrever:

_check-gmail() {
  zle -I
  (
    s=$(stty -g)  # safe zle's terminal setting
    stty sane     # sane settings for curl
    curl -u username --silent "https://mail.google.com/mail/feed/atom" |
     tr -d '\n' | awk -F '<entry>' '{for (i=2; i<=NF; i++) {print $i}}' |
     sed -n "s/<title>\(.*\)<\/title.*name>\(.*\)<\/name>.*/ - /p"
    stty $s       # restore zle's terminal settings
  ) < /dev/tty
}
    
por 22.08.2014 / 16:14
0

Uma abordagem seria solicitar ao usuário antes de executar sua função _check-gmail para que seu script tenha a senha em mãos, em uma variável. Então você passaria a variável de senha em sua função para que o comando curl possa fazer uso dela.

Por exemplo:

$ tst_fun () { echo "Parameter #1 is $1"; }
$ tst_fun "my_pass"
Parameter #1 is my_pass
$ 

Para obter a senha do usuário do seu script, você tem várias opções. Se você quiser uma boa GUI, você pode usar zenity para abrir uma caixa de diálogo pedindo a senha.

Por exemplo:

my_pass=$(zenity --password)
echo "$my_pass"

Agora,quandooscomandosacimasãoexecutados,osresultadosqueforamdigitadosnacaixadediálogoestãodisponíveisnavariável$my_pass.Então,seeufossedigitarasenha"supersecret" na caixa de diálogo, eu pegaria isso:

$ my_pass=$(zenity --password)
$ echo $my_pass
supersecret
    
por 22.08.2014 / 15:12