Openssl 产卵分叉过程中预期EOF过早

Openssl 产卵分叉过程中预期EOF过早,openssl,tcl,expect,tty,ocsp,Openssl,Tcl,Expect,Tty,Ocsp,我有一个相当长/复杂的TCL/Expect脚本,它以CGI和守护程序模式运行openssl ocsp响应程序。该脚本是完整的和功能性的,但是我想使用openssl-OCSP-multi…实现一个多线程的OCSP守护进程,它显示了一些奇怪的行为 TCL 8.6.10 预计5.45.4 OpenSSL 1.1.1g 2020年4月21日 Ubuntu 20.04.1 LTS 5.4.0-42-lowlatency x86_64 下面是我能想到的最简洁的示例代码(另存为ocsp.tcl): 显然,

我有一个相当长/复杂的TCL/Expect脚本,它以CGI和守护程序模式运行
openssl ocsp
响应程序。该脚本是完整的和功能性的,但是我想使用
openssl-OCSP-multi…
实现一个多线程的OCSP守护进程,它显示了一些奇怪的行为

  • TCL 8.6.10
  • 预计5.45.4
  • OpenSSL 1.1.1g 2020年4月21日
  • Ubuntu 20.04.1 LTS 5.4.0-42-lowlatency x86_64
下面是我能想到的最简洁的示例代码(另存为
ocsp.tcl
):

显然,某些选项将扭曲此输出(调试、内部、跟踪、cmdtrace),但最终结果相同

总结如下:

  • shell命令工作
    openssl ocsp-index index.txt-CA.crt-rsigner ocsp.crt-rkey ocsp.key-nmin 300-text-ignore_err-port 2650-timeout 5
  • shell
    multi
    命令工作
    openssl ocsp-index index.txt-CA CA.crt-rsigner ocsp.crt-rkey ocsp.key-nmin 300-text-ignorer\u err-port 2650-timeout 5-multi 5
  • 在后台运行两个shell命令(
    &
    都有效
  • 这些选项中的任何一个组合都有效
    /ocsp.tcl[sudo][internal][debug][trace][cmdtrace][null][raw][rawinit][forever]
  • 运行带有或不带其他选项的
    multi
    失败
    ,然后点击
    Expect:Timeout
    /ocsp.tcl multi[internal][debug][trace][cmdtrace][null][rawinit][forever]
  • 使用
    sudo
    运行
    multi
    时,无论是否使用其他选项都有效:
    /ocsp.tcl multi-sudo[internal][debug][trace][cmdtrace][null][rawinit][forever]
当脚本失败时
tail-f/var/log/syslog
输出
ocsp[]:致命:从父进程组分离时出错:不允许操作
。查看中的显示,这是由失败的
setpgid
导致的消息。将不允许的操作描述为:

EPERM-试图将进程移动到不同会话中的进程组中,或者更改调用进程的子进程的进程组ID,并且该子进程处于不同会话中,或者更改会话引导进程的进程组ID(setpgid(),setpgrp())

我现在的位置:

  • 熟食/熟食模式无关紧要(
    设置stty_init[raw/cooked];stty[-]raw
  • 这不是
    tclsh
    expect
    问题,但可能是expect问题,特别是
    spawn
  • 希望它不是一个
    openssl ocsp-multi.,
    odity/oversight/bug
  • 这与
    spawn
    如何创建/使用pty/tty/会话有关
  • spawn-nottyinit-nottycopy
    在任何组合中都不会产生明显的效果
现在我可以承认失败,然后
生成sudo…
,但这是一种黑客行为

我目前正在尝试用以下内容来补充/替换spawn:

set pty_pid [spawn -noecho -pty]; #just create a pty? or do we make one for std[in|out|err]?
stty raw -echo < $spawn_out(slave,name); #don't echo stdin on the new pty?
#stty raw > $spawn_out(slave,name); #raw stdout on the new pty? THIS KILLS CTRL-C
set spawn_pid [exec -- {*}$cmd > $spawn_out(slave,name) < $spawn_out(slave,name) &] #redirect stin/out to the pty?
close -slave; #no idea
set pty_pid[spawn-noecho-pty]#只是创建一个pty?还是我们为性病做一个?
stty raw-echo<$spawn_out(从机,名称)#不要在新pty上重复标准?
#stty raw>$spawn\u out(从机,名称)#新pty上的原始标准?这会杀死CTRL-C
设置spawn_pid[exec--{*}$cmd>$spawn_out(slave,name)<$spawn_out(slave,name)&]#将stin/out重定向到pty?
近奴隶#不知道
…但正如您从片段中所看到的,我不确定具体如何处理这些pty

如果您能帮助
-multi
工作,我们将不胜感激

编辑:

  • 清理所有内容,以反映所注意到的真正的罪犯(spawn/tty/pty/session/setpgid)
  • 对脚本进行了大量重构以进行更多调试,并为每个注释添加了命令输出
  • 设置CA、root和OCSP签名证书超出了本文的范围,这本身就是一项巨大的工作。足够详细地介绍它。(发表评论)

你能粘贴一个可行的
index.txt
(以及任何其他需要预先存在的文件)让我试一试吗?用
lappend
构建
cmd
会更习惯。也许在
生成之前立即打印该值(用于调试)可以帮助您找出问题所在?当事情不起作用时会打印哪些错误消息?@DonalFellows-更新脚本以反映您的担忧。没有错误消息,除了EOF消息
-multi
用例中放置了“我们不应该到这里”
@sexpect ExpectforShells-设置CA和OCSP响应程序的代码太多,无法粘贴到此处。查看全面的指南。好奇者和好奇者。你试过打开Expect的调试模式吗?您得到的输出可能与您使用的REs不太匹配。您可以粘贴一个可行的
index.txt
(以及任何其他需要预先存在的文件)以便我可以尝试一下吗?使用
lappend
构建
cmd
会更习惯。也许在
生成之前立即打印该值(用于调试)可以帮助您找出问题所在?当事情不起作用时会打印哪些错误消息?@DonalFellows-更新脚本以反映您的担忧。没有错误消息,除了EOF消息
-multi
用例中放置了“我们不应该到这里”
@sexpect ExpectforShells-设置CA和OCSP响应程序的代码太多,无法粘贴到此处。查看全面的指南。好奇者和好奇者。你试过打开Expect的调试模式吗?您得到的输出可能与您使用的分辨率不太匹配。
Expect: Timeout
Expect: Timeout
Expect: Timeout
set pty_pid [spawn -noecho -pty]; #just create a pty? or do we make one for std[in|out|err]?
stty raw -echo < $spawn_out(slave,name); #don't echo stdin on the new pty?
#stty raw > $spawn_out(slave,name); #raw stdout on the new pty? THIS KILLS CTRL-C
set spawn_pid [exec -- {*}$cmd > $spawn_out(slave,name) < $spawn_out(slave,name) &] #redirect stin/out to the pty?
close -slave; #no idea