Передача локальных переменных среды скрипту Python на сервере Windows с использованием SSH

388
Technext

Я пытаюсь выполнить скрипт 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

1 ответ на вопрос

1
Martin Prikryl

Переменные среды не разрешаются в одиночных кавычках.

Попробуйте заменить их двойными кавычками:

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. Я думаю, что одинарная кавычка - [предложенный] (https://serverfault.com/questions/368327/difference-between-single-quotes-and-double-quotes-when-passing-command-through) способ, хотя я пробовал двойную кавычку а также после того, как я прочитал ваше предложение. Ничего не случилось. Команда не выполнялась на компьютере с Windows, `echo` вернул 0, а выходной файл пуст. :( Technext 6 лет назад 0
Какую оболочку использует ваш SSH-сервер? * nix-подобная оболочка или Windows `cmd.exe`? Martin Prikryl 6 лет назад 0
Я запустил эту команду: `ssh john.doe@xx.yyy.zzz.xyz" echo $ SHELL "` и он вернул `/ bin / ash`. Technext 6 лет назад 0
Откуда вы взяли "пепел"? У вас установлен WSL? Martin Prikryl 6 лет назад 0
Я не устанавливал это явно. Я просто проверял, могу ли я установить WSL, но версия моего сервера не совместима. Вот подробности: `Версия # 1607` и` Сборка ОС # 14393.2485`. Я только установил [Win32-OpenSSH] (https://github.com/PowerShell/Win32-OpenSSH) Technext 6 лет назад 0
Но Win32-OpenSSH не поставляется с двоичными файлами * nix (например, `ash`). Martin Prikryl 6 лет назад 0
Да, я только что увидел каталог установки. Там не было Я не уверен, как это было установлено. Я вижу [эту] (https://github.com/PowerShell/Win32-OpenSSH/wiki/DefaultShell) страницу для Win32-OpenSSH. Он говорит, что мы можем изменить оболочку по умолчанию. В любом случае, я могу заставить это работать? Technext 6 лет назад 0
Смотрите мой отредактированный ответ. Martin Prikryl 6 лет назад 0
Виноват. Я должен был изменить синтаксис после проверки оболочки. Благодарю. Я сделал это, но теперь, когда я использую ваш обновленный синтаксис, я получаю, что `'BITBUCKET_REPO_SLUG' не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл`. Я также пытался использовать ключевое слово `export`, но потом получаю похожую ошибку:` 'export' не распознается как внутренний ... `. Я также использовал их в одинарных кавычках, но проблема сохраняется. Technext 6 лет назад 0
Когда вы shell не `ash`, а` cmd.exe`. Martin Prikryl 6 лет назад 0
Давайте [продолжим это обсуждение в чате] (https://chat.stackexchange.com/rooms/83890/discussion-between-technext-and-martin-prikryl). Technext 6 лет назад 0