为RO文件系统上通过ssh启动的命令附加到远程环境变量

时间:2016-11-22 16:53:45

标签: bash ssh environment-variables

我可以在这样的远程机器上运行Python脚本:

ssh -t <machine> python <script>

我也可以这样设置环境变量:

ssh -t <machine> "PYTHONPATH=/my/special/folder python <script>"

我现在想追加远程 PYTHONPATH并尝试

ssh -t <machine> 'PYTHONPATH=$PYTHONPATH:/my/special/folder python <script>'

但这并不起作用,因为$PYTHONPATH无法在远程计算机上进行评估。

SuperUser上有一个非常similar question,并且接受的答案要求我创建一个由sshanother question解释的环境文件,可以通过创建和复制脚本来解决执行的文件而不是python

这是糟糕并要求目标文件系统可写(对我来说情况并非如此)!

有没有一种优雅的方法可以通过ssh传递环境变量,或者为Python提供额外的模块路径?

2 个答案:

答案 0 :(得分:1)

如何使用/bin/sh -c '/usr/bin/env PYTHONPATH=$PYTHONPATH:/.../ python ...'作为远程命令?

编辑(重新评论以证明这应该做它应该给予正确引用的内容):

bash-3.2$ export FOO=bar
bash-3.2$ /usr/bin/env FOO=$FOO:quux python -c 'import os;print(os.environ["FOO"])'
bar:quux

答案 1 :(得分:1)

WFM就像这样:

$ ssh host 'grep ~/.bashrc -e TEST'
export TEST="foo"
$ ssh host 'python -c '\''import os; print os.environ["TEST"]'\'
foo
$ ssh host 'TEST="$TEST:bar" python -c '\''import os; print os.environ["TEST"]'\'
foo:bar

请注意:

  • 围绕整个命令单引号,以避免在本地扩展它
    • 嵌入式单引号因此以签名'\''模式进行转义(另一种方式是'"'"'
  • 赋值中的双引号(仅当值具有空格时才需要,但最好不要依赖它,特别是如果值超出您的控制范围)
  • 在命令中避免使用$VAR:如果我输入了例如echo "$TEST" $ ssh host 'export TEST="$TEST:bar"; echo "$TEST"' foo:bar ,在替换变量

    之前,它将被shell扩展
    • 一种方便的方法是将var替换为单独的命令:

      var myPlayer = videojs('videoPlayer');
      myPlayer.on('timeupdate', function() {
        console.log(this.currentTime());
      });