【问题标题】:Modify a variable in remote bash script修改远程 bash 脚本中的变量
【发布时间】:2018-01-20 05:28:18
【问题描述】:

我想修改远程机器上的现有变量。在本地机器上,我为此使用“sed”。但是如何在远程机器上实现呢?

comlink.sh: 包含应更改的变量的远程文件。

#!/bin/bash
test=1
new=2
ready=0

我如何在本地更改该变量:

sed 's/ready=.*/ready=1/' /home/pi/comlink.sh > tmp
mv tmp /home/pi/comlink.sh

我想要远程实现的方法:

sed 's/ready=.*/ready=1/' ssh pi@[myIP] /home/pi/comlink.sh > tmp
mv ssh pi@[myIP] tmp /home/pi/comlink.sh

但这不是正确的方式或语法。我想我可能需要一些帮助。谢谢!

【问题讨论】:

  • 是否有理由这样做,而不是通过 SSH 命令传递您想要的值?所以,ssh pi@"$yourIP" "env ready=1 /home/pi/comlink.sh",在修改你的脚本以接受它继承的任何值之后(即: "${ready:=0}" 而不是ready=0
  • ready=$1 在脚本中,ssh pi@yourHost "comlink.sh 1" 阅读。
  • 也就是说:最佳实践是将代码和数据分开,从而避免首先尝试将数据放入代码中(然后需要自动编辑该代码)。这使得使用适当的版本控制系统变得更容易(您可以复制代码而不会因数据更改而产生无意的差异),并且更容易创建和执行良好的安全策略(例如在数据为读写时将代码标记为只读) )。
  • 如果你做了 sed -i 's/ready=.*/ready=1/' /home/pi/comlink.sh 你可以跳过创建临时文件并自动覆盖 comlink.sh 文件

标签: bash shell variables ssh sed


【解决方案1】:

Bash 表达式中的第一个词是命令(程序、别名、函数、内置函数等)。 ssh 是一个连接远程机器的程序,所以你不能只将字符串“ssh”放到其他命令中,让它们完成ssh 的工作。这种混淆是可以理解的,因为相反的 有点正确 - 您可以将任意命令传递给 ssh 以便在远程机器上执行它们。

所以虽然sed PATTERN ssh pi@[myIP] ... 毫无意义(您将PATTERN 应用于当前目录中名为sshpi@[myIP] 的文件,这可能不存在),您可以像这样说:

ssh pi@[myIP] "cat /home/pi/comlink.sh"

输出远程计算机上名为/home/pi/comlink.sh 的文件的内容。

您还可以通过 ssh 执行更复杂的操作,例如输出重定向 (>),但您需要确保将要运行的完整命令通过引用传递给 ssh - 否则输出重定向将在本地发生。比较:

ssh pi@[myIP] echo foo > /tmp/foo

对比

ssh pi@[myIP] 'echo foo > /tmp/foo'

前者将在您的远程机器上调用echo foo,并将输出写入您的本地机器上的/tmp/foo。后者将在远程机器上调用echo foo > /tmp/foo

还请查看-i flag for sed - 它会将模式就地应用于给定文件,因此您无需写入临时文件然后移动它。

【讨论】:

  • 感谢您的解释。对于初学者来说复杂的东西。但至少我朝着正确的方向前进!
【解决方案2】:

这样做:这实际上只是一个引用挑战——远程执行 sed 命令

ssh pi@ip "sed -i 's/ready=.*/ready=1/' /home/pi/comlink.sh"

【讨论】:

  • 像魅力一样工作。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多