Bash 对 EOF 上的远程服务器执行多个命令

Bash execute multiple command to a remote server on EOF

提问人:poiubb22 提问时间:3/11/2022 最后编辑:Daniel Widdispoiubb22 更新时间:10/25/2022 访问量:495

问:

我尝试从我的终端,在远程服务器上对 docker 执行 openstack 命令。目的是获取 openstack 项目的 id。

当条件为 true 时,我想获取 id,但下面的脚本无法获取 id。我不知道我是否可以执行 if 条件到 EOF 语句

ret="$(ssh -qT root@server << EOF
  docker exec openstack bash -c ". adminrc &&
  if [ false ]; then  openstack project create p_ops &>/dev/null
  else :
  fi
  id_u=$(openstack user show u_ops | grep " id" | cut -d "|" -f3 | xargs)
  openstack role add SwiftOperator --project p_ops --user $id_u
  id_p=$(openstack project show p_ops | grep " id" | cut -d "|" -f3|xargs)
  echo "$id_p""
EOF
)"

我得到输出:

Missing value auth-url required for auth plugin password
Missing value auth-url required for auth plugin password
usage: openstack role add [-h]
                          [--system <system> | --domain <domain> | --project <project>]
                          [--user <user> | --group <group>]
                          [--group-domain <group-domain>]
                          [--project-domain <project-domain>]
                          [--user-domain <user-domain>] [--inherited]
                          [--role-domain <role-domain>]
                          <role>
openstack role add: error: argument --user: expected one argument

我想要项目的 id:

echo $id_p
faafe2044c4235ac648faaceae5d1a3bf2a8f7a8ca8a765f5a9621a5e53d9162
bash docker openstack eof

评论

0赞 jordanm 3/11/2022
$()在建立 SSH 连接之前在本地计算机上执行。
1赞 David Maze 3/12/2022
与环境变量和 相同。我建议将其分成两到三个不同的部分——将脚本变成脚本,它到远程机器,然后运行它——而不是试图逃避并将所有内容放入一个命令中。不过,这似乎更像是一个 shell 脚本或系统管理问题,而不是与编程相关的问题。$id_u$id_pscp
0赞 Nic3500 3/12/2022
你的报价搞砸了,你应该在其他.您可以在 shellcheck.net 中检查您的语法""

答:

0赞 Rockcat 3/16/2022 #1

您可以避免使用嵌套引号,因为嵌套引号会给您带来问题。

而不是复杂的句子:

openstack user show u_ops | grep " id" | cut -d "|" -f3 | xargs

你可以写:

openstack user show -f value -c id
ret=$(ssh -qT root@server << EOF
  docker exec openstack bash -c ". adminrc &&
  if [ false ]; then openstack project create p_ops &>/dev/null
  else :
  fi
  id_u=$(openstack user show -f value -c id u_ops)
  openstack role add SwiftOperator --project p_ops --user $id_u
  id_p=$(openstack project show -f value -c id p_ops)
  echo $id_p"
EOF
)