使用本地环境变量在具有SSH的远程计算机上运行Shell脚本

jswny

我目前在本地计算机上计算一些环境变量$FOO现在,我有了一个SSH脚本,其中包含一些命令,其中一些命令使用$FOO仅在本地计算机上设置的环境变量

我想在远程计算机上运行这些命令,我想替换的本地版本,$FOO以便当SSH脚本在远程计算机上运行时,它将使用本地计算得出的值$FOO我需要执行此操作,因为命令在远程计算机上的运行方式取决于$FOO我计算出的本地值

我知道您可以ssh user@remote < script.sh在远程计算机上运行本地Shell脚本,但是我不确定如何执行该过程,但是需要使用上面提到的本地 $FOO环境变量。我不想在本地或远程计算机上配置SSH,因此SendEnv这不是我的选择。

用本地环境变量运行Shell脚本中具有的那些命令的最佳方法是什么$FOO

卡米尔·马乔洛夫斯基(Kamil Maciorowski)

我假设您知道什么外壳程序应解释该脚本。此示例使用sh

# somewhat flawed
ssh user@remote "FOO='$FOO' exec sh" < script.sh

本地shell将被替换,$FOO因为它被双引号(is)。单引号用于远程外壳程序(即exec末尾的原始远程外壳程序sh)。

注意ssh将整个命令作为字符串传递它将在远端进行解释。如果$FOO扩展为包含一个或多个单引号的字符串,则整个命令可能行为不当。代码注入是可能的。

要“撤消”可能的单引号,可以尝试以下方法:

# still somewhat flawed
FOOx="$(printf '%s' "$FOO" | sed "s|'|'\"'\"'|g")"
ssh user@remote "FOO='$FOOx' exec sh" < script.sh

在我的Debian 9中,每个'in都更改$FOO'"'"'in $FOOx分析远程外壳程序中的引用以查看中心单引号在字面上会继续存在。

我可以在没有额外变量的情况下执行此操作:

# still somewhat flawed
ssh user@remote "FOO='$(printf '%s' "$FOO" | sed "s|'|'\"'\"'|g")' exec sh" < script.sh

它没有我希望的那么坚定。问题:

  • 我认为,如果某些实现的sed输入是不完整的行(没有结尾的换行符),则可能会打印一条完整的行(带有结尾的换行符)。或者sed可以忽略不完整的行。如果变量的内容不以换行符结尾,则这非常重要。
  • $() 删除所有尾随的换行符。

为了解决这些问题,我x在之前附加了一个换行符sed然后,该工具(与实现无关)应接受所有内容,不应添加任何内容。然后$()将仅删除多余的换行符。我删除了x远端的多余部分。像这样:

# foolproof (AFAIK)
ssh user@remote "FOO='$(printf '%sx\n' "$FOO" | sed "s|'|'\"'\"'|g")'; FOO=\"\${FOO%x}\" exec sh" < script.sh

笔记:

  • 如果您的(本地)$FOO扩展为肯定不含单引号的字符串,则可以使用第一个最简单的命令。
  • 如果您的本地shell是Bash,则可以'"'"'在扩展时将单引号替换为

    # foolproof (AFAIK), needs local Bash
    pattern="'"
    replacement="'\"'\"'"
    ssh user@remote "FOO='${FOO//$pattern/$replacement}' exec sh" < script.sh
    

    这解决了单引号的问题,并且不使用$()也不使用sed,因此不会出现其他提到的问题。我使用了其他变量来避免此问题

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在远程计算机上运行本地脚本之前,先获取源环境变量并执行bash

来自分类Dev

在本地和远程计算机上运行的Shell脚本

来自分类Dev

如何通过SSH运行Shell脚本,以使远程计算机的环境与本地计算机的环境相似?

来自分类Dev

使用ssh和shell脚本在远程计算机上使用变量执行命令

来自分类Dev

使用ssh和shell脚本在远程计算机上使用变量执行命令

来自分类Dev

使用ssh将带有标志的本地脚本运行到远程计算机

来自分类Dev

在远程计算机上运行本地python脚本

来自分类Dev

如何通过多个SSH在远程计算机上的参数中运行带有空格的本地脚本?

来自分类Dev

如何从本地计算机执行存储在远程计算机上的Shell脚本?

来自分类Dev

使用本地计算机上的脚本运行远程R进程

来自分类Dev

如何使用Shell脚本通过SSH删除远程计算机上的文件?

来自分类Dev

使用ssh在其他计算机上运行本地脚本

来自分类Dev

在远程计算机上的Shell脚本中执行命令,并在本地计算机上获取输出

来自分类Dev

是否有可能写一个shell脚本,需要输入然后将ssh到我的本地计算机上的服务器和运行脚本?

来自分类Dev

通过SSH在远程计算机上执行远程脚本

来自分类Dev

如何在远程计算机上打开Firefox,但如何使用SSH在本地计算机上显示?

来自分类Dev

如何允许本地计算机上的jenkins运行远程python测试脚本

来自分类Dev

注销后不久,在具有屏幕和nohup的Linux计算机上远程运行脚本

来自分类Dev

运行make命令后,在远程计算机上执行的Shell脚本退出

来自分类Dev

ssh,启动特定的Shell,并在远程计算机上运行命令?

来自分类Dev

如何在远程计算机上运行PowerShell脚本?

来自分类Dev

在远程Windows计算机上运行bash脚本

来自分类Dev

在远程计算机上运行QTP脚本(Windows 7)

来自分类Dev

如何在远程计算机上运行appium脚本?

来自分类Dev

在远程计算机上运行.reg文件的Powershell脚本

来自分类Dev

linux +在远程计算机上运行脚本

来自分类Dev

在远程计算机上运行Selenium脚本

来自分类Dev

通过ssh在远程计算机上运行docker命令

来自分类Dev

在远程计算机上运行ssh并执行命令

Related 相关文章

  1. 1

    在远程计算机上运行本地脚本之前,先获取源环境变量并执行bash

  2. 2

    在本地和远程计算机上运行的Shell脚本

  3. 3

    如何通过SSH运行Shell脚本,以使远程计算机的环境与本地计算机的环境相似?

  4. 4

    使用ssh和shell脚本在远程计算机上使用变量执行命令

  5. 5

    使用ssh和shell脚本在远程计算机上使用变量执行命令

  6. 6

    使用ssh将带有标志的本地脚本运行到远程计算机

  7. 7

    在远程计算机上运行本地python脚本

  8. 8

    如何通过多个SSH在远程计算机上的参数中运行带有空格的本地脚本?

  9. 9

    如何从本地计算机执行存储在远程计算机上的Shell脚本?

  10. 10

    使用本地计算机上的脚本运行远程R进程

  11. 11

    如何使用Shell脚本通过SSH删除远程计算机上的文件?

  12. 12

    使用ssh在其他计算机上运行本地脚本

  13. 13

    在远程计算机上的Shell脚本中执行命令,并在本地计算机上获取输出

  14. 14

    是否有可能写一个shell脚本,需要输入然后将ssh到我的本地计算机上的服务器和运行脚本?

  15. 15

    通过SSH在远程计算机上执行远程脚本

  16. 16

    如何在远程计算机上打开Firefox,但如何使用SSH在本地计算机上显示?

  17. 17

    如何允许本地计算机上的jenkins运行远程python测试脚本

  18. 18

    注销后不久,在具有屏幕和nohup的Linux计算机上远程运行脚本

  19. 19

    运行make命令后,在远程计算机上执行的Shell脚本退出

  20. 20

    ssh,启动特定的Shell,并在远程计算机上运行命令?

  21. 21

    如何在远程计算机上运行PowerShell脚本?

  22. 22

    在远程Windows计算机上运行bash脚本

  23. 23

    在远程计算机上运行QTP脚本(Windows 7)

  24. 24

    如何在远程计算机上运行appium脚本?

  25. 25

    在远程计算机上运行.reg文件的Powershell脚本

  26. 26

    linux +在远程计算机上运行脚本

  27. 27

    在远程计算机上运行Selenium脚本

  28. 28

    通过ssh在远程计算机上运行docker命令

  29. 29

    在远程计算机上运行ssh并执行命令

热门标签

归档