Передача локальных переменных среды скрипту 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
Martin Prikryl
Переменные среды не разрешаются в одиночных кавычках.
Кроме того, ваш синтаксис, вероятно, не действителен.
Если ваша оболочка 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