Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 将交互命令的输出管道化到less_Bash_Openssl_Pipe_Less Unix - Fatal编程技术网

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