web-dev-qa-db-ja.com

SSHを使用してWindowsサーバー上のPythonスクリプトにローカル環境変数を渡す

Windows Server2016でPythonスクリプトを実行しようとしています。Windowsサーバーに Win32-OpenSSH がインストールされています。pythonスクリプトは2つの環境変数(BITBUCKET_REPO_SLUGおよびBITBUCKET_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
Technext

環境変数は一重引用符で囲まれた文字列では解決されません。

それらを二重引用符で置き換えてみてください。

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

さらに、構文はおそらく無効です。

  • シェルがWindowsの場合cmd.exe:コマンドを区切るためにセミコロン(;)を使用することはできません。アンパサンド(&)を使用する必要があります。

    set VAR1=$VALUE & set VAR2=$VALUE2 & python ...
    
  • シェルがbashのような一般的な* nixシェルのエミュレーションである場合:setコマンドは環境変数を設定するためのものではありません。 bashでは、BITBUCKET_REPO_SLUG=$BITBUCKET_REPO_SLUGのように割り当てだけで変数を設定します。

    VAR1=$VALUE1; VAR2=$VALUE2; python ...
    
1
Martin Prikryl