Truyền biến môi trường cục bộ cho tập lệnh Python trên máy chủ Windows bằng SSH


1

Tôi đang cố gắng thực thi tập lệnh Python trên máy chủ Windows 2016. Tôi đã cài đặt Win32-OpenSSH trên máy chủ Windows. Kịch bản python dự kiến ​​sẽ có hai biến môi trường ( BITBUCKET_REPO_SLUGBITBUCKET_BRANCH). Chúng đã được đặt mặc định trong đường ống Bitbucket. Tập lệnh python được sao chép vào máy chủ từ xa và sau đó sử dụng SSH, tôi gọi nó từ đường ống Bitbucket.

Khi tôi đang thử lệnh sau trong đường ống Bitbucket của mình ...

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

... Tôi đã nhận được lỗi sau:

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'

Dường như với tôi rằng các biến môi trường Bitbucket không được chuyển sang tập lệnh python (có lẽ vì tôi không chạy nó từ chính đường ống mà vì tôi đã gọi nó trên máy chủ từ xa). Vì vậy, giữ mọi thứ khác, tôi chỉ thay đổi sshlệnh như sau:

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

Với thay đổi ở trên, đường ống hiển thị bản dựng thành công và trạng thái trả về ( $?) luôn in 0. Ngoài ra, cat ./cmd_outputkhông in gì cả. Như bạn có thể mong đợi, trên máy chủ Windows, tập lệnh python không thực sự chạy.

Nội dung của C:/Users/john.doe/deploy.py:

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

Tôi không chắc chính xác những gì tôi đang làm sai. Bất kỳ trợ giúp sẽ thực sự được đánh giá cao.

Câu trả lời:


1

Các biến môi trường không được giải quyết trong chuỗi trích dẫn đơn.

Hãy thử thay thế chúng bằng dấu ngoặc kép:

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

Hơn nữa cú pháp của bạn có thể không hợp lệ.

  • Nếu hệ vỏ của bạn là Windows cmd.exe: Bạn không thể sử dụng dấu chấm phẩy ( ;) để phân tách các lệnh. Bạn phải sử dụng ký hiệu ( &).

    set VAR1=$VALUE & set VAR2=$VALUE2 & python ...
  • Nếu shell của bạn là một mô phỏng của một số shell * nix phổ biến, như bash: setlệnh không dành cho việc thiết lập các biến môi trường. Trong bash, bạn đặt các biến đơn giản bằng một bài tập, như BITBUCKET_REPO_SLUG=$BITBUCKET_REPO_SLUG.

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

Cảm ơn nhưng về điều trích dẫn, tôi đã gặp một tình huống tương tự trước đây mặc dù thời điểm đó tất cả là môi trường dựa trên * nix. Tôi nghĩ rằng trích dẫn đơn là cách được đề xuất mặc dù tôi cũng đã thử trích dẫn kép sau khi tôi đọc đề xuất của bạn. Không có chuyện gì xảy ra. Lệnh không chạy trên máy Windows, echotrả về 0 và tệp đầu ra trống. :(
Technext

Máy chủ SSH của bạn sử dụng shell nào? * vỏ giống như nix hay Windows cmd.exe?
Martin Prikryl

Tôi chạy lệnh này: ssh john.doe@xx.yyy.zzz.xyz "echo $SHELL"và nó trở lại /bin/ash.
Technext

Bạn đã lấy ashtừ đâu? Bạn đã cài đặt WSL chưa?
Martin Prikryl

Tôi đã không cài đặt nó một cách rõ ràng. Tôi chỉ kiểm tra xem tôi có thể cài đặt WSL không nhưng phiên bản máy chủ của tôi không tương thích. Dưới đây là chi tiết: Version # 1607OS Build # 14393.2485. Tôi mới chỉ cài đặt Win32-OpenSSH
Technext
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.