如何通过脚本检查提示输入密码的 GMail 消息?

如何通过脚本检查提示输入密码的 GMail 消息?

我在 Ubuntu 14.04 上通过 SSH 使用 Putty 使用 zsh,并且正在为键盘设置键绑定。因为 zsh 似乎没有使用我的功能键,所以我想我应该设置脚本来执行类似于按键上的图片所代表的操作。我正在研究电子邮件按钮,它运行得很好,但我希望它能更好。这就是我所拥有的~/.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>.*/\2 - \1/p"
    echo
    exit
}
zle -N _check-gmail


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

当像上面那样使用时它就起作用了。我有两个问题。

首先也是最重要的,我宁愿让它询问我密码,而不是像这样将其留在脚本中。通过:password从命令行中删除curl命令可以轻松完成此操作,但在此文件中使用时会导致问题。具体来说,它似乎接受第一个按键,但其余的按键则退出到另一个 shell,该 shell 不是密码输入。

其次,我第一次在 shell 中运行它时它运行得很好。之后它不会正确返回提示。我需要按Enter才能得到另一个提示。有办法解决这个问题吗?

.zshrc我已将文件的完整键绑定部分放在GitHub

答案1

问题是它curl需要一些正常的终端设置,并且zle不希望您更改终端设置。所以你可以这样写:

_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>.*/\2 - \1/p"
    stty $s       # restore zle's terminal settings
  ) < /dev/tty
}

答案2

一种方法是在运行函数之前提示用户,_check-gmail以便脚本在变量中掌握密码。然后,您将密码变量传递到函数中,以便命令curl可以使用它。

例如:

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

要从脚本的用户那里获取密码,您有多种选择。如果您想要一个漂亮的 GUI,您可以zenity弹出一个对话框,要求输入密码。

例如:

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

                                          SS #1

现在,当运行上述命令时,输入到对话框中的结果可在变量中使用$my_pass。因此,如果我在对话框中输入密码“supersecret”,我会得到以下信息:

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

相关内容