Bash 将交互命令的输出管道化到less
我想做点像Bash 将交互命令的输出管道化到less,bash,openssl,pipe,less-unix,Bash,Openssl,Pipe,Less Unix,我想做点像 openssl enc -d -aes256 -in somefile | less openssl需要来自stdin的密码。当涉及到less时,这一切都会变得一团糟 是否有一种方法可以从交互式命令(如openssl请求密码)获取输出,并将输出导入less 或者有更好的使用bash脚本的技术吗?您可以尝试以下方法: echo 'mypassword' | openssl enc -d -aes256 -in somefile | less 但这看起来并不安全 我没有尝试过以这种方
openssl enc -d -aes256 -in somefile | less
openssl
需要来自stdin
的密码。当涉及到less
时,这一切都会变得一团糟
是否有一种方法可以从交互式命令(如openssl
请求密码)获取输出,并将输出导入less
或者有更好的使用bash脚本的技术吗?您可以尝试以下方法:
echo 'mypassword' | openssl enc -d -aes256 -in somefile | less
但这看起来并不安全
我没有尝试过以这种方式运行openssl
,但如果它太冗长,并且如果以前的代码不起作用,那么您可以尝试使用。下面是一个例子:
expect -c '
spawn yourscript
expect "Please enter your password:"
send "$PASSWORD"
'
也许让shell脚本请求密钥,然后将密钥存储在临时文件中,并使用openssl的-kfile选项来查找它。希望您的openssl版本支持-kfile 我会担心这样做的安全性,但稍微小心一点,安全漏洞可能比你想象的要小。(但您是否信任您的系统管理员和sudoers…?)
下面的方法行得通,但我希望找到一种不使用临时文件的方法<代码>$tmp_文件=$(mktemp);openssl enc-d-in somefile>$tmp_文件;减去$tmp_文件;rm$tmp_file我一直使用
rsync
在ssh
上执行此操作,通常没有问题。当事情真的搞混了,这似乎是一个时间问题——这已经有一段时间没有发生了,但正如我所记得的,如果rsync在请求密码时很慢,事情就会变得一团糟。请不要忘记在变量周围使用双引号。将$TMPKEY
替换为“$TMPKEY”
。这一点非常重要,因为如果文件包含空格字符,那么它将被拆分为两个单独的参数。例如:myFile='myawesome file'
rm“$myFile”将删除一个名为myawesome file
的文件,这是正确的。但是rm$myFile
将删除三个文件:my
,awesome
和file
,这是错误且不可预测的,除非你真的知道自己在做什么。一般来说,这是一个很好的规则。在示例脚本中创建并使用了十几行之内的TMPKEY变量后,我知道它不包含空格($$resolves to all digits)。但正如您所说,大多数脚本都应该使用更安全的技术:引用包含单个任意路径名的变量。关键是您的脚本就是一个例子,人们很可能会根据自己的喜好更改变量,但他们不希望仅仅因为目录中的空格而失败。请您修复它,这样我就可以投票了吗?编辑为使用mktemp(1)来选择临时文件名并创建它,这样子shell和umask技术就不需要了。带引号的变量存储文件名。
#!/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