【问题标题】:How do I use the system() command to pass in user input?如何使用 system() 命令传入用户输入?
【发布时间】:2013-07-30 20:23:16
【问题描述】:

我想使用system("insert shell command here") 并传入一个脚本。但是,此脚本需要用户输入。我也想传递用户输入。我该怎么做?

我试过了:

system('./script')
system('input1')
system('input2')

但是,Ruby 会等到第一个系统调用完成后才继续进行下一个。

可以这样做吗?我试过system('./script', 'input1'),但也没有用。 exec 也没有运气。

【问题讨论】:

  • 您想将用户的输入内容通过管道传输到脚本中?该脚本如何检索输入?如果是身份验证,通常会失败,因为密码输入通常只接受来自 TTY 或 KBD 设备,而不是 STDIN。

标签: ruby shell command


【解决方案1】:

您应该查看 Ruby 标准库中的 Open3 library。它使您可以更好地控制“脱壳”。

output, status = Open3.capture2("./script", :stdin_data => "I am STDIN")

【讨论】:

  • 嗯,好吧,但如果不使用外部库,这是不可能的吗?
  • 什么外部库? Open3 是 Ruby 的一部分。
  • 这个应该起作用,除非被调用的脚本正在执行身份验证,否则 OP 是 SOL,除非有办法将输入伪装成来自 KBD 或 TTY 设备。
【解决方案2】:
#!/usr/bin env ruby

input1 = ARGV[0]
input2 = ARGV[1]

system("./script #{input1} #{input2}")

【讨论】:

  • ARGV[0]; rm -rf / 时会发生什么?请不要尝试查看它的作用。
  • 好点。是的,必须小心。可以放置一个 if 条件以避免 rm -rf / 命令。经验法则是定义可以接受的内容,然后拒绝其他所有内容。也可以看看 Shellwords.escape
  • system 可以完全绕过shell 时,为什么还要麻烦这些呢?用于构建system 命令的字符串插值几乎从来都不是一个好主意,就像对 SQL 使用字符串插值几乎从来都不是一个好主意一样。
  • 这会将输入作为参数传递。但是,该脚本不接受任何参数。相反,它会定期运行并要求用户输入某些变量,这些是我要填写的变量
猜你喜欢
  • 2021-10-13
  • 2021-11-11
  • 2013-05-26
  • 2015-12-18
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
相关资源
最近更新 更多