Передати змінні локального середовища до скрипта Python на сервері Windows за допомогою SSH


1

Я намагаюся виконати скрипт Python на сервері Windows 2016. У мене є Win32-OpenSSH встановлений на сервері Windows. Сценарій python очікує два змінні середовища ( 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 john.doe@xx.yyy.zzz.xyz '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 john.doe@xx.yyy.zzz.xyz '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 john.doe@xx.yyy.zzz.xyz "set BITBUCKET_REPO_SLUG=$BITBUCKET_REPO_SLUG;  ..." >> ./cmd_output

Далі ваш синтаксис, ймовірно, недійсний.

  • Якщо ваша оболонка Windows cmd.exe: Не можна використовувати крапку з комою ( ; ) для розділення команд. Необхідно використовувати амперсанд ( & ).

    set VAR1=$VALUE & set VAR2=$VALUE2 & python ...
    
  • Якщо ваша оболонка є емуляцією деякої загальної оболонки * nix, начебто bash: set Команда не призначена для встановлення змінних середовища. В bash, ви задаєте змінні просто присвоюванням, наприклад BITBUCKET_REPO_SLUG=$BITBUCKET_REPO_SLUG.

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

Спасибі, але за цитата речі, я натрапив на подібну ситуацію, перш ніж, хоча, що час це було все * Nix середовища. Я думаю, що єдина цитата запропонував шлях, хоча я намагався подвійний цитата, а також після того, як я прочитав вашу пропозицію. Нічого не сталося. Команда не працювала на машині Windows, echo повернув 0 і вихідний файл був порожнім. :(
Technext

Яку оболонку використовує ваш сервер SSH? * nix-подібні оболонки або Windows cmd.exe?
Martin Prikryl

Я виконав цю команду: ssh john.doe@xx.yyy.zzz.xyz "echo $SHELL" і він повернувся /bin/ash.
Technext

Де ви взяли ash від? У вас встановлений WSL?
Martin Prikryl

Я не встановив це явно. Я просто перевіряв, чи можу я встановити WSL, але моя серверна версія не сумісна. Ось деталі: Version # 1607 і OS Build # 14393.2485. Я тільки встановив Win32-OpenSSH
Technext
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.