使用 SSH 将本地环境变量传递给 Windows 服务器上的 Python 脚本

使用 SSH 将本地环境变量传递给 Windows 服务器上的 Python 脚本

我正在尝试在 Windows Server 2016 上执行 Python 脚本。Win32的OpenSSH安装在 Windows 服务器上。python 脚本需要两个环境变量(BITBUCKET_REPO_SLUGBITBUCKET_BRANCH)。这些已经在 Bitbucket 管道中默认设置。python 脚本被复制到远程服务器,然后使用 SSH,我从 Bitbucket 管道调用它。

当我在 Bitbucket 管道中尝试以下命令时...

scp <copy_python_script_to_win_server> # Works fine
echo $BITBUCKET_REPO_SLUG   # Prints the repo name
echo $BITBUCKET_BRANCH     # Prints the branch name
ssh [email protected] 'C:/Python/bin/python.exe C:/Users/john.doe/deploy.py' >> ./cmd_output
echo $?            
cat ./cmd_output

...我收到以下错误:

Traceback (most recent call last):
  File "C:/Users/john.doe/deploy.py", line 16, in <module>
    print(os.environ['BITBUCKET_REPO_SLUG'])
  File "C:\Python\lib\os.py", line 669, in __getitem__
    raise KeyError(key) from None
KeyError: 'BITBUCKET_REPO_SLUG'

在我看来,Bitbucket 环境变量没有传递给 python 脚本(很可能是因为我没有从管道本身运行它,而是因为我在远程服务器上调用它)。因此,保持其他一切不变,我只将命令更改ssh为以下内容:

ssh [email protected] 'set BITBUCKET_REPO_SLUG=$BITBUCKET_REPO_SLUG; set BITBUCKET_BRANCH=$BITBUCKET_BRANCH; C:/Python/bin/python.exe C:/Users/john.doe/deploy.py' >> ./cmd_output

经过上述更改后,管道显示构建成功,返回状态 ( $?) 始终打印 0。此外,cat ./cmd_output不打印任何内容。正如您所料,在 Windows 服务器上,python 脚本实际上并未运行。

内容C:/Users/john.doe/deploy.py

import os
...
print(os.environ['BITBUCKET_REPO_SLUG'])
print(os.environ['BITBUCKET_BRANCH'])
...
...

我不确定我到底做错了什么。任何帮助都将不胜感激。

答案1

环境变量无法在单引号字符串中解析。

尝试用双引号替换它们:

ssh [email protected] "set BITBUCKET_REPO_SLUG=$BITBUCKET_REPO_SLUG;  ..." >> ./cmd_output

此外,您的语法可能无效。

  • 如果您的 shell 是 Windows cmd.exe:您不能使用分号 ( ;) 来分隔命令。您必须使用与号 ( &)。

    set VAR1=$VALUE & set VAR2=$VALUE2 & python ...
    
  • 如果您的 shell 是某些常见 *nix shell 的模拟,例如bashset命令不用于设置环境变量。在 中bash,您只需通过赋值即可设置变量,例如BITBUCKET_REPO_SLUG=$BITBUCKET_REPO_SLUG

    VAR1=$VALUE1; VAR2=$VALUE2; python ...
    

相关内容