我正在编写一个脚本,让用户使用 vim 编辑 gpg 加密文件。我已经使用非对称加密完成了此操作,如下所示:
#!/bin/sh
# TODO: add support for symmetric encryption
if [ $# -ne 1 ]; then
echo "Needs two arguments, exiting"
exit
else
file="$1"
fi
if [ -z "$EDITOR" ]; then
editor="vim"
else
editor=$EDITOR
fi
tmp_file="$(mktemp)"
gpg -d --yes -o "$tmp_file" "$file"
gpg_exit=$?
if [ $gpg_exit -ne 0 ]; then
echo "Decryption failed, exiting"
rm $tmp_file
exit
fi
original_mod_time=$(stat -c %Y "$tmp_file")
$editor "$tmp_file"
new_mod_time=$(stat -c %Y "$tmp_file")
if [ "$original_mod_time" -ne "$new_mod_time" ]; then
gpg -o "$file" -e --yes -r recipient "$tmp_file"
gpg_exit=$?
if [ $gpg_exit -ne 0 ]; then
echo "Encryption failed, exiting"
fi
fi
shred -u "$tmp_file"
但是,当我想编写一个支持对称加密的脚本时,我不希望让用户输入两次密码,因为这可能会导致输入错误,而且很烦人。因此,我必须以某种方式存储密码。我可以,read passphrase
但运行gpg --passphrase $passphrase
并不安全,因为任何进程都可以读取命令行参数。还有其他方法可以做到这一点吗?我不想将密码存储在文件中。
另外,有没有办法可以编写这样的脚本而无需创建任何文件(没有临时文件)?这样会更安全。像这样的东西会很好:
gpg -d $file | vim --some-option | gpg -c -o $file
答案1
有一些 vim 插件可用于此目的,例如vim‑gnupg
:用于透明编辑 gpg 加密文件的插件。
没有太多选项可以隐藏命令行参数中的秘密。这些都是有效的,它们通常需要从 stdin 读取。我首选的是临时文件描述符:
read -s secret
cat <( s=$secret printenv s )
# cmdline only shows pseudo-file path like
cat /dev/fd/67
如果添加-
类似内容,Vim 可以从 stdin 读取gpg -d $file | vim -
。
:w !gpg -c -o $file
您可以使用vim 内部将vim 的输出写入另一个命令(对于其他人将使用的东西没有用),但是如果没有像这个答案这样的一些尴尬的流操作,您就无法在管道中使用 vim:https://stackoverflow.com/a/10686895/7411885. 你也可以vipe
使用更多工具将输出到管道。
您可以在配置中禁用 vim 的临时文件.vimrc
:
set nobackup "no backup files
set nowritebackup "only in case you don't want a backup file while editing
set noswapfile "no swap files