无法识别外壳程序“ |&”语法

时间:2019-06-06 16:38:59

标签: shell ansible

我正在ansible剧本中运行一个shell命令,我想在其中存储输出的最后一行,但出现以下错误:

  致命:[网络服务器]:失败! => {“ changed”:true,“ cmd”:“ ./ hash.sh -p admin123 |&tail -1 ”,“ delta”:“ 0:00:00.002563”,“结束“:”“ 2019-06-06 16:25:56.597951”,“失败”:true,“ msg”:“非零返回码”,“ rc”:2,“开始”:“ 2019-06-06 16 :25:56.595388“,” stderr“:” / bin / sh:1:语法错误:\“&\”意外“,” stderr_lines“:[” / bin / sh:1:语法错误:\“&\”意外”],“ stdout”:“”,“ stdout_lines”:[]}

main.yaml

HttpSession session = request.getSession();
if(session == null){
  System.println("session is null");
}else{
  Object _id = session.getAttribute("id");
  ObjectId id = _id != null ? new ObjectId((String)_id) : _id;
}

当我直接在远程计算机上运行该命令(- name: Get hash value of admin password shell: "./hash.sh -p {{admin_password}} |& tail -1" args: chdir: /usr/share/tools register: admin_password_hash )时,它会为我提供正确的输出。

1 个答案:

答案 0 :(得分:4)

假设您是说|&将通过管道重定向stderr,则cmd1 |& cmd2的POSIX兼容替代方案(因此,与/bin/sh一起工作的方式)是cmd1 2>&1 | cmd2

- name: "Get hash value of admin password"
  shell: "./hash.sh -p {{admin_password | quote}} 2>&1 | tail -1"
  args:
    chdir: /usr/share/tools
  register: admin_password_hash

| quote很重要:如果没有选择$(rm -rf /*)作为其密码的人,可能会导致整个系统被擦除,因此如果没有它,您可能会遇到重大的安全问题。 (请注意,这是Bobby Tables使用的密码!)