将交互式命令的输出导入到 less 中

7

我想做类似于以下的事情

openssl enc -d -aes256 -in somefile | less

openssl需要从stdin获取密码。当使用less时,这会变得非常混乱。

有没有一种方法可以将交互式命令(例如要求密码的openssl)的输出导入到less中?

或者是否有一种更好的技术可以使用bash脚本来完成?


以下代码可以运行,但我希望找到一种不使用临时文件的方法... $tmp_file=$(mktemp); openssl enc -d -in somefile > $tmp_file; less $tmp_file; rm $tmp_file - patrick h
我经常使用rsync通过ssh进行此操作,通常没有问题。当出现混乱时,似乎是一个时间问题 - 已有一段时间没有发生了,但我记得如果rsync在请求密码时慢了,情况就会变得很糟糕。 - drevicko
2个回答

3
也许可以让shell脚本要求输入密钥,然后将密钥存储在临时文件中,并使用openssl的-kfile选项查找它。希望你的openssl版本支持-kfile。
虽然需要小心安全问题,但是只要小心一些,安全漏洞可能比你想象的要小。(但你信任你的系统管理员和sudoers吗...?)
#!/bin/bash

INFILE=somefile

read -s -p "Enter key for $INFILE: " key
echo

# write the key to a temp file; use mktemp(1)
# for safer creation of a privately-owned file.
#
TMPKEY=$(mktemp -t) || exit 1
echo "$key" > "$TMPKEY"

# will remove the temp file on script exit
trap 'rm -f "$TMPKEY"' EXIT

# remove the key file a couple seconds after openssl runs
(sleep 2; rm -f "$TMPKEY") &

openssl enc -d -aes256 -in "$INFILE" -kfile "$TMPKEY" | less

[ -f "$TMPKEY" ] && rm -f "$TMPKEY"
trap - EXIT

# rest of script...

exit 0

请不要忘记在变量周围使用双引号。将“$TMPKEY”替换为“$TMPKEY”。这非常重要,因为如果文件名包含空格,则会将其拆分为两个单独的参数。例如:myFile='my awesome file' rm "$myFile" 将删除一个名为“my awesome file”的文件,这是正确的。但是,rm $myFile 将删除三个文件:myawesomefile,这是错误的和不可预测的,除非你确实知道自己在做什么。 - Aleks-Daniel Jakimenko-A.
总的来说,这是一个非常好的规则。在示例脚本的十几行代码中创建并使用了TMPKEY变量后,我知道它不包含空格($$解析为所有数字)。但正如您所说,大多数脚本应该使用更安全的技术:引用保存单个任意路径名的变量。 - sjnarv
重点是你的脚本只是一个示例,很可能人们会根据自己的喜好更改变量,但他们并不希望它因为目录中的空格而失败。你能否修复它,以便我可以投票支持? - Aleks-Daniel Jakimenko-A.
1
编辑使用mktemp(1)选择临时文件名并创建它,因此不需要子shell和umask技术。 引用存储文件名的变量。 - sjnarv

1
你可以尝试这个:

echo 'mypassword' | openssl enc -d -aes256 -in somefile | less

但这看起来不太安全。

我还没有尝试过使用此方式运行openssl,但如果它过于冗长,或者之前的代码无法工作,您始终可以尝试使用 expect。以下是一个例子:

expect -c '
    spawn yourscript
    expect "Please enter your password:"
    send "$PASSWORD"
'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接