【问题标题】:Pass bash variable when sshingSSH 时传递 bash 变量
【发布时间】:2018-06-19 17:50:17
【问题描述】:

我在多人运行需要端口转发的应用程序时遇到了一些问题。我想生成一个随机端口号,ssh 到应用程序服务器,同时传递该随机数,sed 在几个不同的脚本中用这个端口替换默认端口。

那么有什么方法可以通过 ssh 传递 bash 变量,或者有更好的方法来实现这一点?

【问题讨论】:

  • 如果您只是生成一个随机数,那么在本地生成它与在您sshd 所在的机器上生成它有什么区别?
  • 因为它是一个随机数,在建立 ssh 连接时用作转发端口,也是从 docker 容器转发到该远程服务器的端口(两跳连接)
  • ssh name@host "sed -i -e \"s/$myrandnumber/22/g\" file1 file2 file3" 有效吗?
  • 这些文件可能位于不同的位置,所以我打算在服务器上使用一些 python 代码(无论它位于何处),运行时会提取我希望的 shell 变量的值传递,然后稍后使用它来重写具有已知相对路径(但不知道绝对路径)的文件中的值。我知道这有点令人困惑,也许另一种方法会更干净。
  • ssh name@host "python myscript.py $myrandnumber" ?

标签: bash ssh parameter-passing


【解决方案1】:

如果您知道要对变量做什么,可以将其传递给远程主机并在同一行运行命令:

ssh name@host "sed -i -e \"s/$myrandnumber/22/g\" file1 file2 file3"

$myvar 将在 sshing 发生之前扩展,这意味着它将是您在原始机器上设置的值,而不是遥控器。您可以将其设置为远程机器上的变量:

ssh name@host "export remotevar=$myrandnumber; bash -i" 

但它只对当前会话可用。如果您只想将变量存储在未来某个日期,那么您最好的选择是写入一个稍后将获取源的文件,即,

ssh name@host "echo \"myvar=$myrandnumber\" >> /etc/environment"

【讨论】:

  • 应该更清楚。第一行不能做任何事情(已编辑)。如果不写入某处的文件,则无法跨多个会话创建全局变量。您可以做的最接近的做法是附加到 /etc/environment,以便该计算机上的所有用户都将拥有该变量。
  • 这是预期的行为。它确实连接了。连接仅在命令执行期间处于打开状态。一旦它用完"" 中的命令,它就会终止连接并将您返回到本地计算机。这就是为什么你不能只发送一个变量;您必须立即知道如何处理它,或者通过将其写入某处的文件来保持它。
  • 否,但您可以写入文件然后重新连接。如果您写信到某个登录来源的地方,例如.bashrc/etc/environment,您将拥有该变量
  • 实际上,您可以通过调用 shell 作为传递给 SSH 的命令的一部分来维护连接,类似于上一个示例:ssh name@host "export remotevar=$myvar; bash -i"
  • @Austin 嘿,我错了,请参阅上面的评论。
猜你喜欢
  • 1970-01-01
  • 2013-03-28
  • 2012-10-21
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
  • 2017-02-22
  • 1970-01-01
相关资源
最近更新 更多