有没有办法明智地做到这一点:
scp user@host:/path/to/file /dev/tty | openssl [options] | less
无需创建文件,也不必直接在参数中提供密码?
问题是,两者都要求输入密码,但它们启动的顺序(因此也是它们要求密码的顺序)未定义。
scp
先完成然后开始就可以了openssl
,但没有临时文件。
到目前为止可能的解决方案
- 将输出
scp
放入变量中,然后将变量放入openssl
(仅适用于小文件,而且我怀疑二进制数据等可能存在一些问题) - 将密码放入文件中(不好)
- 使用按键(更好的?)
- 使用命名管道
命名管道版本 1
mkfifo pipe && {
scp user@host:/path/to/file pipe # asks for password, then waits
# for read from pipe to finish
# which will only happen after the
# password for openssl was supplied
# => must ^Z and enter the password
# => `pipe: Interrupted system call'
openssl [options] -in pipe | less
}
命名管道版本 2
mkfifo pipe && {
scp user@host:/path/to/file pipe & # asks for password (and works when
# password is entered) despite being
# put in background (what? how?
# can someone explain?)
openssl [options] -in pipe | less # `bad password read'
}
命名管道版本 3
mkfifo pipe && {
scp user@host:/path/to/file pipe | # asks for password first
openssl [options] -in pipe | less # asks for password after scp's
# password has been entered
# and everything works fine
}
切换命令没有帮助。
openssl [options] -in <(scp user@host:/path/to/file /dev/tty) | less
不起作用。
有人可以吗
- 提出另一种解决方案,
解释 scp 关于示例 1 的异常行为(“系统调用中断”)(我假设它是一个错误或某种“安全功能”),
解释输入密码的工作原理,例如。在后台启动的任务如何从 stdin 读取,
- (与 3 相关。)解释为什么示例 2 中的 scp 会打印密码提示,即使 stdout 和 stderr 都重定向到
/dev/null
?