【问题标题】:How have both local and remote variable inside an SSH command locally availableSSH命令中的本地和远程变量如何在本地可用
【发布时间】:2018-10-18 13:13:16
【问题描述】:

这是问题的变体:How have both local and remote variable inside an SSH command

如何将“ssh 变量”B 获取到我的本地计算机?

 A=3
 ssh host@name "echo $A; B=5; echo $A; echo \$B;"
 echo $A
 echo $B
 echo \$B

返回 3,NOTHING,$B

如何在本地访问 B 的值?

基于cmets的一些解释: 我正在使用 bash 脚本来访问远程主机以修改那里的一些内容,其中包括在那里创建一个工作区。这个工作区的位置是我想要存储在一个变量中并保存以备后用。

基本上,我有一个功能可以转到远程主机并创建工作区,然后还有另一个功能可以使用该工作区的路径在那里做其他事情。

我希望有一个轻量级、纤薄的解决方案,可以通过类似下面的命令进行集成和轻松读取:

 ssh host@name "ws_allocate myworkspace; workspace=ws_find myworkspace;"

然后在本地使用 $workspace。这是一个更大的 bash 脚本的一部分,对于非专业 bash 用户(比如我自己)来说应该很容易理解......

原来这是bash—Better way to store variable between runs?的副本

【问题讨论】:

  • 您可以将远程变量的内容保存在一个文件中,然后在您的本地主机中恢复文件内容。
  • 这对我来说太复杂了;)
  • 为什么?编写本地脚本,scp 将本地脚本上传到远程服务器,ssh 执行脚本并将结果存储在 /tmp 文件中(在远程服务器中),scp 下载响应,然后在本地处理答案。
  • 想一想:您希望在本地 shell 中定义一个由远程 shell 定义的变量。这是一些重要的进程间通信;这并不简单。
  • 另一方面,如果您的示例是准确的,并且赋值语句在ssh 的参数中是硬编码的,那么您为什么不直接在本地定义它呢?

标签: linux bash ssh


【解决方案1】:

你可以这样做:

X=$(ssh user@host 'echo $X')

这将在服务器上运行 echo $X 并将结果输出放在局部变量 X 中,稍后您可以通过说 $X 来使用它

因此要将其应用于您的示例,您可以说:

workspace=$(ssh host@name 'ws_allocate myworkspace; ws_find myworkspace;')

请注意,局部变量workspace 将包含远程运行命令的输出。所以我假设在您的示例中 ws_find myworkspace 将打印任何输出,并且对 ws_allocate 的调用是静默的。

【讨论】:

  • C=$(ssh user@host "echo $B"); echo $C 空输出
  • 这是因为你使用了双引号"echo $B"。尝试使用单引号:'echo $B'
  • 在 ssh 断开连接时 B 会丢失,因此当我再次连接以通过 echo 将其保存在 C 中时,B 是否不可用?
  • 是的;如果您在上一个 ssh 会话中创建了该变量,则该变量在下一个会话中将不可用。但在那种情况下,我也不明白这样做的意义,请澄清你要做什么。
  • 谢谢,我又学到了很多东西。在我的示例中,恐怕这不会成功(请参阅下面的答案)
【解决方案2】:

好的,所以在我看来是最简单的并且允许将 $B 的值存储在远程主机上的解决方案是将其保存在文件中。正如这里已经描述和讨论的那样:bash—Better way to store variable between runs? :(

ssh ${supercomputer} "
ws_list -a >workspaces.txt;
if grep -q "${experiment}" workspaces.txt; 
then echo 'we have a workspace already'; 
else ws_allocate ${experiment} 30; 
fi; 
ws_find ${experiment} > mypathtoworkspace;"

其中超级计算机是主机的地址,试验我想创建的工作区(或不创建,如果它已经存在的话)和工作区我想为我的试验创建的工作区。

我想在本地使用远程工作区的路径,例如

 echo "${workspace}"

但这似乎不可能 - 因此我将下载我正在远程主机上编写的文件并从该文件中读取路径以在本地使用它

如果有人看到更好的解决方案,欢迎!

【讨论】:

  • 这对我来说没有意义。您的问题是关于获取远程变量到本地机器,答案是在远程机器上存储本地值?
  • 它是存储在远程机器上的远程值。我不会在这个 ssh 命令中离开我的远程主机
  • 我明白了。您是否同意这不是问题所在?
  • 在整体上下文中它是,在答案的上下文中可能不是
猜你喜欢
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 2020-06-02
  • 2013-03-24
  • 2012-07-16
  • 2014-09-20
  • 2013-10-28
  • 1970-01-01
相关资源
最近更新 更多