【问题标题】:Source environment variables and execute bash before running local script on remote machine [duplicate]在远程机器上运行本地脚本之前源环境变量并执行 bash [重复]
【发布时间】:2014-10-19 12:13:13
【问题描述】:

我正在尝试使用 ssh 连接执行远程本地脚本。我已经阅读了有关它的语法的文档。但我的问题是,在运行脚本之前,我需要执行 bash 和 source 环境变量。

这看起来适合我,但它没有源命令:

ssh [user]@[server] 'bash -s' < [local_script]

我已经用 EOF 尝试过这样的事情,但它对我也不起作用:

#!/bin/bash
/usr/bin/ssh  "$user@$$host" <<EOF
bash -s
source /dir/to/profile/.profile
source /dir/to/env/set/env.sh
/path/to/script/script.sh stop
EOF

您对这种远程命令的实现有想法吗?我必须在环境设置之前获取配置文件,否则会出现异常。但主要问题是关于来源。

也许这是一个简单的问题,但我没有任何想法。提前感谢您的所有回答。

【问题讨论】:

  • 也许 -t 选项将有助于在登录 shell 中初始化环境。 ssh user@server 'bash -t -c local_script'
  • 第一个示例和第二个示例之间的区别在于,第一个示例将 bash -s 作为远程命令运行并将脚本作为输入发送给它,而第二个示例将四行文本作为标准发送输入到远程主机上的默认命令/shell。如果您将bash -s 移动到第二个示例中的命令位置,它会起作用吗?
  • 这两种解决方案都行不通,我尝试了很多方法,但都行不通!! :(
  • /dir/to/profile/.profile 之类的文件是否存在于本地计算机或远程计算机上? - 因为它们现在的使用方式假定它们存在于 remote。
  • 它们存在于远程

标签: bash shell ssh


【解决方案1】:

我修复了编写另一个模板脚本的问题,该脚本获取环境变量并运行脚本。并且希望它有效。

PROFILE=/dir/to/profile/.profile
source $PROFILE
cd /dir/to/script
/bin/bash script $1

如果在 bash shell 中使用 source 命令,#!/bin/bash 不适用于 source 命令。

感谢你们所有的cmets。

【讨论】:

    【解决方案2】:

    我知道它很旧,但只是想补充一点,它可以在没有额外文件的情况下完成 - 使用 '\' 来转义局部变量和远程命令替换 - 即:

    ssh me@somehost "RMTENV=\$(ls /etc/profile) && source \$RMTENV"
    

    我用它来执行远程java命令,需要ENV来查找java。

    【讨论】:

      【解决方案3】:

      eval 可以为您完成此任务:

      eval $(cat /path/to/environment) ./script.sh
      

      如果你知道的话,你也可以通过这种方式获取多个文件 路径:

      eval $(cat /path/to/environment1 /path/to/environment2) ./script.sh
      

      或者遍历一个目录:

      eval $(cat $(find -type f /path/to/environments)) ./script.sh
      

      如果您要远程执行此操作以解决您的特定问题,请将 SSH 放在它前面:

      # note the quotes otherwise we'll source our local environment
      ssh user@host "'eval $(cat /path/to/environment)' ./remote_script.sh"
      
      # If it's a local environment you want to sort, then do the same
      # command without the quotes:
      ssh user@host "eval $(cat /path/to/environment)" ./remote_script.sh
      

      如果您想将远程环境导入到您自己的环境中,请使用 eval 本地如此:

      eval "$(ssh user@host cat /path/to/environment)" ./local_script.sh
      

      这一切都让您可以获取一个外部文件,将其环境变量设置在将调用您的脚本的同一个分叉实例中(使它们可用)。

      考虑一个如下所示的脚本文件:

      #!/bin/sh
      echo "$VAR1"
      echo "$VAR2"
      test_function
      

      现在考虑您的环境文件如下所示:

      # Environment Variables
      VAR1=foo
      VAR2=bar
      test_function()
      {
         echo "hello world"
      }
      

      如果您使用 eval 示例,您会看到输出:

      foo
      bar
      hello world
      

      或者,如果您只是打开您编写的脚本,您可以源 这些环境变量直接来自其中,然后您就可以 正常调用脚本,没有任何技巧:

      #!/bin/sh
      
      # Source our environment by starting with period an then following
      # through with the full path to the environment file. You can also use
      # the 'source' keyword here too instead of the period (.).
      . /path/to/environment
      
      echo "$VAR1"
      echo "$VAR2"
      test_function
      

      【讨论】:

        猜你喜欢
        • 2012-09-30
        • 1970-01-01
        • 1970-01-01
        • 2011-06-30
        • 2018-10-04
        • 1970-01-01
        • 2016-04-02
        • 1970-01-01
        • 2014-04-14
        相关资源
        最近更新 更多