Các ký tự thoát trong systemd ExecStart bị lỗi

Oct 16 2020

Tôi có đoạn mã sau để trích xuất một giá trị từ tệp cấu hình jnlp của máy chủ jenkins. Nó hoạt động ngoài hộp trong thiết bị đầu cuối nhưng không hoạt động như một đơn vị. Tôi muốn một đơn vị để tôi có thể đặt giá trị ở đâu đó và sử dụng nó như một biến môi trường. Tuy nhiên, tôi vẫn nhận được lỗi trình tự thoát. Tôi tìm thấy điều này cho thấy tôi chỉ cần lo lắng về dấu ngoặc kép và dấu gạch chéo, nhưng tôi nhận được kết quả tương tự. Đây là ExecStarttệp có kèm theo sed:

ExecStart=/bin/sh -c 'curl -L -s -X GET http://10.x.x.x:8080/computer/name-of-executor/slave-agent.jnlp | sed \"s/.*<application-desc main-class=\"hudson.remoting.jnlp.Main\"><argument>\([a-z0-9]*\).*/\1/\" >> /etc/build_environment'

Tôi đã thử nhiều cách kết hợp các ký tự thoát nhưng không có kết quả. Ngoài ra, tôi sử dụng một mẫu giống hệt nhau để trích xuất một giá trị từ siêu dữ liệu (sử dụng curl, piping, v.v.) và điều đó hoạt động tốt. Chắc chắn bối rối về những gì đang xảy ra ở đây

Trả lời

1 meuh Oct 16 2020 at 18:53

Cách đơn giản để gỡ lỗi này là để thêm tùy chọn -vvào sh -cđể xem những gì systemd là thực sự đi qua nó. Nếu chúng tôi làm điều này, chúng tôi có thể thấy chúng tôi đang nhận được (giảm khả năng đọc):

curl ... | sed "s/... main-class="hudson...">.../\1/" >>...

Lỗi cú pháp là lệnh được trích dẫn kép được cung cấp cho sed có bên trong nó "thay vì \". Điều này là do systemd thay thế \"bằng "cách bừa bãi trong ExecStartchuỗi.

Bạn cần chuyển dấu gạch chéo ngược sang shbằng cách sử dụng \\(systemd sẽ giảm thành \), sau đó là dấu ngoặc kép:

ExecStart=/bin/sh -cv 'curl... | sed "s/...main-class=\\"hudson...