【问题标题】:Ruby Open3.popen3 simulate user inputRuby Open3.popen3 模拟用户输入
【发布时间】:2023-04-07 09:14:01
【问题描述】:

我正在尝试运行需要用户输入的 bash 脚本 (@command),并且我正在尝试使用以下代码提供该脚本输入:

Open3.popen3(@command) 做 |stdin、stdout、stderr| stdin.write("y") 标准输出.gets 结尾

这是脚本的一个想法:

exec sudo su -c "some command" $username

如果有人能告诉我我做错了什么,或者对如何以不同的方式实现这一点有任何建议,那将不胜感激。


另外,我可以像这样运行脚本:

@output = `#{@command}`

在这种情况下,我可以在运行我的应用程序的控制台中看到脚本输出的内容。如果有任何方法可以向该位置提供输入,那也可以。

【问题讨论】:

    标签: ruby bash sinatra popen3


    【解决方案1】:

    在这里找到我的解决方案: How to fix hanging popen3 in Ruby?

    Open3.popen3(@command) 做 |stdin、stdout、stderr| stdin.puts "y\r\n" 标准输出.each_line { |line|放线} 标准输入关闭 结尾

    【讨论】:

    • 如果您的代码需要在 STDIN 上输入,您需要在发送输入后closeSTDIN,否则它可能会挂起等待更多。仅仅发送一条带有行尾的行通常是不够的,必须关闭流,就像你提到的答案所说的那样。
    • 如果子进程尝试向其写入大量数据,则忽略 stderr 是致命的。如果超过了管道缓冲区的大小,该操作将暂停 suprocess。请参阅pipe 的手册页。您可以使用Open3.popen2eOpen3.capture* 来避免这种情况。
    • 如果您的@commandcat,则需要在从标准输出读取之前关闭stdin。否则cat 将继续等待输入,从stdout 读取将挂起。经验法则是:尽早关闭stdin,以便让您的子进程知道不会有更多数据出现。更好的是,使用标准包装器:Open3.capture2*
    【解决方案2】:
    out_err, status = Open3.capture2e(@command, :stdin_data => "y\r\n")
    print out_err
    

    【讨论】:

      猜你喜欢
      • 2014-10-09
      • 2017-02-12
      • 2015-06-25
      • 2016-05-31
      • 2013-02-08
      • 1970-01-01
      • 2015-10-22
      • 1970-01-01
      相关资源
      最近更新 更多