到目前为止可能的解决方案

到目前为止可能的解决方案

有没有办法明智地做到这一点:

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不起作用。


有人可以吗

  1. 提出另一种解决方案,
  2. 解释 scp 关于示例 1 的异常行为(“系统调用中断”)(我假设它是一个错误或某种“安全功能”),

  3. 解释输入密码的工作原理,例如。在后台启动的任务如何从 stdin 读取,

  4. (与 3 相关。)解释为什么示例 2 中的 scp 会打印密码提示,即使 stdout 和 stderr 都重定向到/dev/null


相关内容