{"id":352,"date":"2026-10-13T18:41:08","date_gmt":"2026-10-13T18:41:08","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2014\/05\/27\/ways-to-login-jenkins-using-command-line\/"},"modified":"2026-10-13T18:41:09","modified_gmt":"2026-10-13T18:41:09","slug":"ways-to-login-jenkins-using-command-line","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/ways-to-login-jenkins-using-command-line\/","title":{"rendered":"Jenkins Command-Line Authentication and Job Triggers with cURL and Wget"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>Originally published on 2014-05-27; fully revised and updated.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you need to start Jenkins jobs from scripts, cron, or other automation, you usually do not \u201clog in\u201d interactively. Instead, you authenticate HTTP requests (typically with username + API token) and call Jenkins job endpoints. This guide shows reliable command-line patterns with <strong>cURL<\/strong> and <strong>wget<\/strong>, plus common failure fixes.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2014\/05\/jenkins-login-command-line.png\" alt=\"Jenkins login and command-line trigger\" width=\"600\" height=\"400\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">What \u201clogin\u201d means for Jenkins CLI and scripts<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For scripted access, Jenkins authentication is normally sent with each request. In practice, that means:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Use a Jenkins username and API token (preferred for scripts).<\/li><li>Call job endpoints such as <code>\/job\/&lt;name&gt;\/build<\/code> or <code>\/job\/&lt;name&gt;\/buildWithParameters<\/code>.<\/li><li>Use HTTP <code>POST<\/code> when triggering builds.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Command-line trigger workflow<\/h2>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Create API token in Jenkins user settings] --> B[Test authenticated request]\n    B --> C[POST build endpoint]\n    C --> D{Build queued?}\n    D -- yes --> E[Monitor queue or build status]\n    D -- no --> F[Check credentials permissions and CSRF crumb]\n    F --> C\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Method 1: Trigger Jenkins jobs with cURL<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Basic authenticated trigger<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-bash\">curl -X POST <span class=\"hljs-string\">\"http:\/\/jenkins:8080\/job\/my%20job\/build\"<\/span> \\\n  --user <span class=\"hljs-string\">\"username:api_token\"<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Trigger with delay<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-bash\">curl -X POST <span class=\"hljs-string\">\"http:\/\/server\/view\/name\/job\/jobname\/build?delay=0sec\"<\/span> \\\n  --user <span class=\"hljs-string\">\"username:api_token\"<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Trigger a parameterized job<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-bash\">curl -X POST <span class=\"hljs-string\">\"http:\/\/jenkins:8080\/job\/my-job\/buildWithParameters\"<\/span> \\\n  --user <span class=\"hljs-string\">\"username:api_token\"<\/span> \\\n  --data <span class=\"hljs-string\">\"ENV=prod\"<\/span> \\\n  --data <span class=\"hljs-string\">\"VERSION=1.2.3\"<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">If CSRF protection blocks POST requests<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Some Jenkins setups require a crumb header for POST requests. A common approach is to fetch the crumb, then send it with the build trigger:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-bash\">CRUMB=$(curl -s --user <span class=\"hljs-string\">\"username:api_token\"<\/span> \\\n  <span class=\"hljs-string\">\"http:\/\/jenkins:8080\/crumbIssuer\/api\/xml?xpath=concat(\/\/crumbRequestField,\\\":\\\",\/\/crumb)\"<\/span>)\n\ncurl -X POST <span class=\"hljs-string\">\"http:\/\/jenkins:8080\/job\/my-job\/build\"<\/span> \\\n  --user <span class=\"hljs-string\">\"username:api_token\"<\/span> \\\n  -H <span class=\"hljs-string\">\"$CRUMB\"<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Method 2: Trigger Jenkins jobs with wget<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original post highlighted a version-specific behavior difference in wget authentication flags.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">wget 1.11 style<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-bash\">wget --auth-no-challenge \\\n  --http-user=<span class=\"hljs-string\">\"user\"<\/span> \\\n  --http-password=<span class=\"hljs-string\">\"apiToken\"<\/span> \\\n  <span class=\"hljs-string\">\"http:\/\/jenkins.yourcompany.com\/job\/your_job\/build?token=TOKEN\"<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">wget 1.10.x legacy style<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-bash\">wget <span class=\"hljs-string\">\"http:\/\/user:apiToken@jenkins.yourcompany.com\/job\/your_job\/build?token=TOKEN\"<\/span>\n\nwget <span class=\"hljs-string\">\"http:\/\/yourserver\/job\/MyJobname\/build?delay=0sec\"<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">cURL vs wget for Jenkins automation<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Tool<\/th><th>Best for<\/th><th>Strengths<\/th><th>Watch-outs<\/th><\/tr><\/thead><tbody><tr><td>cURL<\/td><td>General Jenkins API automation<\/td><td>Flexible methods, headers, and payload handling<\/td><td>Requires explicit handling for auth headers and possible CSRF crumbs<\/td><\/tr><tr><td>wget<\/td><td>Simple URL-based triggers and legacy scripts<\/td><td>Very simple for basic HTTP calls<\/td><td>Authentication behavior can differ by version; credential-in-URL patterns are less safe<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">References and scripted client options<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For Groovy, Perl, Java, and broader API patterns, see the original references:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/wiki.jenkins-ci.org\/display\/JENKINS\/Authenticating+scripted+clients\">https:\/\/wiki.jenkins-ci.org\/display\/JENKINS\/Authenticating+scripted+clients<\/a><\/li><li><a href=\"https:\/\/wiki.jenkins-ci.org\/display\/JENKINS\/Remote+access+API\">https:\/\/wiki.jenkins-ci.org\/display\/JENKINS\/Remote+access+API<\/a><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Troubleshooting common failures<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>401 Unauthorized:<\/strong> username or API token is wrong, or user has no API access.<\/li><li><strong>403 Forbidden:<\/strong> user lacks job permissions, or CSRF crumb is required but missing.<\/li><li><strong>404 Not Found:<\/strong> job path is wrong (including folder\/view path issues).<\/li><li><strong>Request succeeds but no build appears:<\/strong> verify the endpoint (<code>build<\/code> vs <code>buildWithParameters<\/code>) and required parameters.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Best practices<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Use <strong>API tokens<\/strong> instead of account passwords in scripts.<\/li><li>Avoid embedding credentials directly in URLs when possible.<\/li><li>Store tokens in environment variables or a secret manager, not in plain-text scripts.<\/li><li>Use least-privilege Jenkins users dedicated to automation.<\/li><li>Log HTTP status codes in automation so failures are detectable and actionable.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Learn practical ways to authenticate scripted requests to Jenkins and trigger jobs from the command line using cURL and wget. This revision also covers CSRF crumb handling, version caveats, and troubleshooting.<\/p>\n","protected":false},"author":1,"featured_media":3719,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[42],"tags":[824,2233,1122,545,145,830,2230,2234,2232,822,897,1802,2231,593,213,1452,670],"class_list":["post-352","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jenkins","tag-command-line","tag-commands-for-login-in-jenkins","tag-guide","tag-how","tag-jenkins","tag-jenkins-guide","tag-jenkins-login","tag-jenkins-login-by-command-line","tag-jenkins-login-through-command-line","tag-jenkins-tutorial","tag-login","tag-login-jenkins","tag-login-jenkins-using-command-line","tag-process","tag-tutorial","tag-ways","tag-what"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/352","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=352"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/352\/revisions"}],"predecessor-version":[{"id":79220,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/352\/revisions\/79220"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/3719"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=352"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=352"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=352"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}