2015-02-18 13 views
10

Tôi muốn vô hiệu hóa một công việc Jenkins bằng cách gửi một yêu cầu curl gửi đến Jenkins.Làm thế nào để vô hiệu hóa một công việc Jenkins thông qua curl?

Tôi đã cố gắng làm điều đó bằng:

  1. curl -X POST http://<server>:8080/<jobname>/disable
  2. curl -X POST http://<server>:8080/<jobname>/disable?token=<token>
  3. curl -u <username>:<token> POST http://<server>:8080/<jobname>/disable

nhưng thất bại trong mọi lúc. Các lỗi tôi nhận được là:

403 không crumb hợp lệ đã được bao gồm trong yêu cầu

Có curl dựa trên giải pháp tốt cho vấn đề này?

Trả lời

7

Lỗi crumb cho biết bạn đang sử dụng CSRF Protection. Bạn cần bao gồm tiêu đề chính xác trong yêu cầu của bạn. Crumb có thể lấy từ API Jenkins như được mô tả trên trang wiki Jenkins được liên kết ở trên. Các answer cho "Xây dựng tham số kích hoạt với curl và crumb" cho thấy cú pháp để thêm tiêu đề crumb trong yêu cầu curl.

+0

là c dữ liệu rumb luôn luôn cố định hoặc tôi có để có được nó bằng cách sử dụng một truy vấn mọi lúc? – rrawat

+0

@ rwt Crumb chủ yếu là tĩnh, nhưng nó phụ thuộc vào tên người dùng và IP của khách hàng. Nếu bạn đang viết một kịch bản mà các thông số đó sẽ thay đổi, bạn nên yêu cầu mẩu tin ở đầu kịch bản. –

2

dưới đây đang làm việc cho tôi

curl -X POST http://<servername>/job/jobname/disable 

Hãy chắc chắn rằng truy cập người dùng để làm điều đó.

+1

này sẽ chỉ làm việc nếu không có bảo vệ CSRF – rrawat

11

Không có mẩu hợp lệ có nghĩa là Jenkins của bạn đã bật tùy chọn bảo mật ngăn chặn yêu cầu gửi theo cách tiêu chuẩn để tránh one-click attacks. Bạn không thể sử dụng Jenkins CLI, bởi vì nó doesn't work yet.

Dưới đây là các bước sử dụng curl (thay thế localhost với địa chỉ Jenkins của bạn):

  1. Lưu ý API dùng của bạn Mã (từ /user/USER/configure).
  2. Nhận cốm của bạn:

    CRUMB=$(curl -s 'http://USER:[email protected]:8080/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)') 
    
  3. Bây giờ bạn có thể vô hiệu hóa công việc bằng cách gửi cốm trong tiêu đề:

    curl -X POST -H "$CRUMB" http://USER:[email protected]:8080/<jobname>/disable 
    

    Nếu ở trên sẽ không làm việc cho một số lý do, bạn có thể cố gắng sử dụng -u USER:TOKEN để thay thế.

+1

Hoạt động tuyệt vời! Lưu ý rằng nó có thể sạch hơn khi sử dụng 'curl -u user: pass http: // localhost: 8080/...' thay vì có user/pass trong chính URL đó (tùy thuộc vào cách bạn đang script nó). – geerlingguy

3

tôi tìm thấy phần đầu của giải pháp kenorb của làm việc cho tôi, ví dụ:nhận được cốm, nhưng đối với phần thứ hai, curl không thích cú pháp đó, nó nói:

curl: (6) Không thể giải quyết chủ 'http:'

Vì vậy, tôi đã phải sử dụng cú pháp sau mà làm việc:

curl -H $CRUMB http://localhost:8080/<jobname>/disable -u USER:TOKEN

+0

cảm ơn bạn, đây là những gì tôi cần trong ứng dụng java của tôi, gửi người dùng: mã thông báo trong tiêu đề yêu cầu –

4

thiết lập "cài đặt toàn cầu an ninh" Jenkins của: Bỏ chọn "Ngăn chặn trang web Hội Chữ thập khai thác Yêu cầu giả mạo"

+0

Điều này phù hợp với tôi. –

+0

Cảm ơn. Cái này làm việc tốt cho tôi !!! –

+2

Vô hiệu hóa tính năng bảo vệ CSRF sẽ mở ra lỗ hổng bảo mật và khiến cho cá thể của bạn dễ bị tấn công bởi các liên kết được tạo ra độc hại https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF) – Andy

Các vấn đề liên quan