Übergeben Sie lokale Umgebungsvariablen mithilfe von SSH an ein Python-Skript auf einem Windows-Server

504
Technext

Ich versuche, ein Python-Skript auf dem Windows-Server 2016 auszuführen. Ich habe Win32-OpenSSH auf dem Windows-Server installiert. Das Python-Skript erwartet, dass zwei Umgebungsvariablen ( BITBUCKET_REPO_SLUGund BITBUCKET_BRANCH) vorhanden sind. Diese sind in der Bitbucket-Pipeline bereits standardmäßig festgelegt. Das Python-Skript wird auf den Remote-Server kopiert und dann mit SSH aus der Bitbucket-Pipeline aufgerufen.

Als ich den folgenden Befehl in meiner Bitbucket-Pipeline ausprobierte ...

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 

... Ich habe folgende Fehlermeldung erhalten:

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' 

Mir schien, dass die Bitbucket-Umgebungsvariablen nicht an das Python-Skript übergeben wurden (höchstwahrscheinlich, weil ich es nicht über die Pipeline selbst ausgeführt habe, sondern weil ich es auf einem Remote-Server aufrief). Um alles andere zu behalten, habe ich den sshBefehl nur wie folgt geändert :

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 

Mit der obigen Änderung zeigt die Pipeline den erfolgreichen Build an und der Rückgabestatus ( $?) gibt immer 0 aus. Außerdem wird cat ./cmd_outputnichts gedruckt. Wie zu erwarten, läuft das Python-Skript auf dem Windows-Server nicht wirklich.

Inhalt von C:/Users/john.doe/deploy.py:

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

Ich bin mir nicht sicher, was genau ich falsch mache. Jede Hilfe wird wirklich geschätzt.

1

1 Antwort auf die Frage

1
Martin Prikryl

Umgebungsvariablen werden nicht in Strings mit einfachen Anführungszeichen aufgelöst.

Versuchen Sie, sie durch Anführungszeichen zu ersetzen:

ssh john.doe@xx.yyy.zzz.xyz "set BITBUCKET_REPO_SLUG=$BITBUCKET_REPO_SLUG; ..." >> ./cmd_output 

Außerdem ist Ihre Syntax wahrscheinlich nicht gültig.

  • Wenn Ihre Shell Windows ist cmd.exe: Sie können kein Semikolon ( ;) verwenden, um Befehle zu trennen. Sie müssen ein kaufmännisches Und ( &) verwenden.

    set VAR1=$VALUE & set VAR2=$VALUE2 & python ... 
  • Wenn Ihre Shell eine Emulation einer üblichen * nix-Shell ist, können Sie mit dem Befehl bash: setnicht Umgebungsvariablen setzen. In setzen bashSie Variablen einfach durch eine Zuweisung, wie BITBUCKET_REPO_SLUG=$BITBUCKET_REPO_SLUG.

    VAR1=$VALUE1; VAR2=$VALUE2; python ... 
Danke, aber für die Zitat-Sache, bin ich vorher auf eine ähnliche Situation gestoßen, obwohl es damals alles * nix-basierte Umgebung war. Ich denke, das einfache Anführungszeichen ist die [vorgeschlagene] (https://serverfault.com/questions/368327/difference-between-single- quotes-and-double- quotes-when-passing-command-through) - Methode, obwohl ich das doppelte Zitat versucht habe auch nachdem ich Ihren Vorschlag gelesen habe. Nichts ist passiert. Der Befehl wurde nicht auf einem Windows-Computer ausgeführt, "echo" gab 0 zurück und die Ausgabedatei war leer. :( Technext vor 6 Jahren 0
Welche Shell verwendet Ihr SSH-Server? * Nix-ähnliche Shell oder Windows `cmd.exe`? Martin Prikryl vor 6 Jahren 0
Ich habe diesen Befehl ausgeführt: `ssh john.doe@xx.yyy.zzz.xyz" echo $ SHELL "` und es wurde `/ bin / ash` zurückgegeben. Technext vor 6 Jahren 0
Woher hast du "Asche"? Hast du WSL installiert? Martin Prikryl vor 6 Jahren 0
Ich habe es nicht explizit installiert. Ich habe gerade geprüft, ob ich WSL installieren kann, aber meine Serverversion ist nicht kompatibel. Hier sind die Details: `Version # 1607` und` OS Build # 14393.2485`. Ich habe nur [Win32-OpenSSH] installiert (https://github.com/PowerShell/Win32-OpenSSH). Technext vor 6 Jahren 0
Win32-OpenSSH enthält jedoch keine * nix-Binärdateien (wie 'ash'). Martin Prikryl vor 6 Jahren 0
Ja, ich habe gerade das Installationsverzeichnis gesehen. Es war nicht da Ich bin nicht sicher, wie das installiert wurde. Ich sehe diese Seite (https://github.com/PowerShell/Win32-OpenSSH/wiki/DefaultShell) für Win32-OpenSSH. Es besagt, dass wir die Standard-Shell ändern können. Wie kann ich das funktionieren lassen? Technext vor 6 Jahren 0
Siehe meine bearbeitete Antwort. Martin Prikryl vor 6 Jahren 0
Mein Fehler. Ich hätte die Syntax nach der Überprüfung der Shell ändern sollen. Vielen Dank. Ich habe das getan, aber jetzt, wenn ich Ihre aktualisierte Syntax verwende, erhalte ich, dass '' BITBUCKET_REPO_SLUG 'nicht als interner oder externer Befehl, als bedienbares Programm oder als Batch-Datei erkannt wird. Ich habe auch vorher versucht, das `export'-Schlüsselwort zu verwenden, aber dann erhalte ich einen ähnlichen Fehler:` 'export' wird nicht als internes ... erkannt. Ich habe sie auch für einzelne Anführungszeichen verwendet, aber das Problem bleibt bestehen. Technext vor 6 Jahren 0
Wenn Sie Shell nicht `ash`, sondern` cmd.exe` verwenden. Martin Prikryl vor 6 Jahren 0
Lassen Sie uns [diese Diskussion im Chat fortsetzen] (https://chat.stackexchange.com/rooms/83890/discussion-between-technext-and-martin-prikryl). Technext vor 6 Jahren 0