linux - bash 变量扩展通过管道传输到 ssh

标签 linux bash shell ssh

我不知道如何在 shell 脚本中声明/引用这些变量。

给定 commands_to_execute_on_remote.sh 的内容为:

for c in 1 2 3 4 5
do
    supervisorctl restart broadcast-server-${ENVIRONMENT_NAME}-${c}
done

ENVIRONMENT_NAME 在本地机器上声明为环境变量...

当我从本地机器运行它时,例如:

cat commands_to_execute_on_remote.sh | ssh user@123.456.789

我如何引用这些变量,以便在脚本通过管道传输到远程框时,$ENVIRONMENT_NAME 被填充为实际值,但 $c 显然是脚本中的循环计数器?

最佳答案

将命令放在单独的文件中是不必要的复杂化。

ssh user@123.45.67.89 <<____EOF
    for c in 1 2 3 4 5; do
        supervisorctl restart broadcast-server-${ENVIRONMENT_NAME}-\$c
    done
____EOF

请注意您希望如何在远程 ssh shell 中评估 $c(因此您需要将其从本地 shell 中转义),而 $ENVIRONMENT_NAME 在将命令行发送到远程服务器之前由本地 shell 展开。

如果你坚持将脚本片段放在一个文件中,比如

sed "s/[$][{]ENVIRONMENT_NAME[}]/$ENVIRONMENT_NAME/" commands_to_execute_on_remote.sh |
ssh user@132.45.67.89

允许这样做(并避免丑陋的 useless cat )。 (如果删除技术上不必要的大括号,则需要调整正则表达式;如果 ENVIRONMENT_NAME 可以包含斜杠,请使用不同的分隔符,例如 "s%...%...%"。)

关于linux - bash 变量扩展通过管道传输到 ssh,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47532477/

相关文章:

bash - 如何使用 setenv 在 bash 中设置环境变量?

ruby - 如何在没有 shell 转义的情况下使用 system() 在 Ruby 中执行和捕获外部命令的标准输出?

shell - 更短的 Scala 脚本头

linux - bash:静默杀死后台函数进程

linux - gdb 无法附加到进程

由于 key 中包含 "!",Django SECRET_KEY 错误

Linux 不同的发行版命令

c++ - 审核 bash RPG 的 bash 命令

linux - 如何找到Linux模块路径

将 secret 消息翻译成真实字母的Python程序