我想使用 GnuPG 解密存储在远程主机(运行 Linux)上的短信,即:
ssh [<user>@]<host>
gpg -d <file-to-decrypt>
- 与 gpg-agent 交互和/或直接输入密码
- 关闭 SSH 连接
但采用更自动化的方式。我只想输入一个命令,脚本应该会完成其余工作(除了(交互式)输入密码),即:
remote-gpg [<user>@]<host> <file-to-decrypt>
- [查询密码但不以明文形式返回]
- [将解密后的文本转储到标准输出] 并关闭 SSH 连接
我的主要挑战是合并“ssh”和“gpg”步骤。
我正在寻找一种简单有效的方法来实现这一目标:
- 尽可能少地依赖客户侧(理想情况下,仅
ssh
+ 核心实用程序) - 无需在服务器端处理大量套接字和管道
- 无需假设是否
gpg-agent
在服务器上运行
因此,编写 GNUexpect
脚本之类的解决方案是不可能的。
动机:一个典型的用例是使用手机(运行 Android)从远程服务器检索加密消息(例如密码)。信息传递后关闭连接是理想的,因为您可能会在手机丢失/被盗之前忘记注销,而小偷无法在不猜出密码的情况下检索更多信息(因为每次都会查询密码)。最后,从服务器的 authorized_keys 文件中删除手机的 SSH 密钥即可防止安全漏洞。
顺便问一下,这种方法是否会有额外的安全风险(与 4 步手动流程相比)?
答案1
ssh -t user@host gpg -d file
我认为事情没必要比这更复杂。
解密后的输出将回显到您的终端。该-t
选项要求 ssh 请求一个 tty,这是 gpg 可以在您的终端上提示输入密码所必需的。
在我看来,这与您的 4 步方法一样安全。
答案2
tldr 你想要有人为你写代码。幸运的是,我已经有类似的东西了。
解密.sh:
#!/bin/bash
# Get our original tty and turn off -echo
stty_orig=`stty -g` stty -echo
read Pass
# type in your pass for gpg.
gpg --passphrase="$Pass" --no-tty -d $1
# Output goes to STDOUT
stty $stty_orig
调用方式:
ssh -t user@host 'decyrpt.sh File'
假设:您的文件位于主目录中,并且 decrypt.sh 位于您的 $PATH 中。