【问题标题】:BASH: How to send params & data to a process on STDINBASH:如何将参数和数据发送到 STDIN 上的进程
【发布时间】:2011-07-08 08:49:07
【问题描述】:

我正在编写一个 curl 调用脚本,您可以通过 STDIN 输入密码和参数(将密码保留在 cmd 行之外)。

我还需要在 STDIN 上发送 POST 数据(大量数据无法放入 cmd 行)。

所以,我可以通过命令行成功地做到这一点:

> curl -K --data-binary @- -other_non-pw_params
> -u "username:password"
> <User types ctrl-d>
> lots_of_post_data
> lots_of_post_data
> <User types ctrl-d>
> <User types ctrl-d>

现在...我正在尝试在 BASH 脚本中执行此操作...

一厢情愿的伪代码:

{ echo '-u "username:password"'
  echo <ctrl-d>    |   cat dev/null   |   ^D
  echo lots_of_post_data
  echo lots_of_post_data
} | curl -K --data-binary @- -other_non-pw_params

【问题讨论】:

  • 你离得不远了......我认为你需要改变的只是 到正确的转义序列等。你试过了吗?
  • 不知道我会使用什么转义序列。
  • echo 手册页告诉您它支持哪些转义序列。但我认为 Ignacio 的回答是正确的——Bash 不能“关闭”STDOUT,这正是你所需要的。如果您需要发送 Ctrl-D/EOF,您可能需要比 shell 脚本更复杂的东西。

标签: linux bash shell curl password-protection


【解决方案1】:

啊哈!对此有一个特定于 curl 的解决方案。

您在 STDIN 上传递所有参数,并将 --data-binary @- (或等效的)保留到最后,然后将其作为数据输入接受之后的所有内容。示例脚本:

#!/bin/bash
{ echo '--basic'
  echo '--compress'
  echo '--url "https://your_website"'
  echo '-u "username:password"'
  echo '--data-binary @-'
  echo 'lots_of_post_data'
  echo 'lots_of_post_data'
} | curl --config -

【讨论】:

    【解决方案2】:

    使用“这里的文档”:

    curl --config - <<EOF
    --basic
    ...
    EOF
    

    【讨论】:

    • 好主意,但是如果将这两行“echo 'lots_of_post_data'”替换为循环来填充数据,这是否可行?
    • 啊,不。在这种情况下,您的解决方案会更好。
    【解决方案3】:

    没有办法像在终端保存中的 Ctrl-D 那样模拟 EOF,以完全停止向流发送数据。您将需要找到一种不同的方法来执行此操作,也许是用更强大的语言编写脚本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多