I'm trying to use curl in Windows Powershell to download a file from an SFTP/FTPS site, I have tried to follow the examples in How to use curl on Windows, which seem to indicate that I can download from an SFTP/FTPS site. I do the following:
PS C:\temp> curl -User 'username:password' -Uri 'ftp://ftp.company.com/devops/path/somefile.txt' -OutFile somefile.txt
But I get the following error
curl : The remote server returned an error: (530) Not logged in.
At line:1 char:1
+ curl -User 'username:password' -Uri 'ftp://ftp.company.com/devops ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.FtpWebRequest:FtpWebRequest) [Invoke-WebRequest], W
ebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestComma
nd
I've also tried ideas in other Stackoverflow posts, e.g., How to use the curl command in PowerShell?, to no avail. What is my syntax error?
Building on the helpful comments:
In Windows PowerShell (but no longer in PowerShell (Core) 7+)
curlis built-in alias ofInvoke-WebRequest, whose syntax is very different from that ofcurl.exe.To reliably invoke the latter on Windows, invoke it with
.exe(curl.exe ...)curl.exeships with Windows since Windows 10 / Windows Server 2019.Your attempt ended up calling
Invoke-WebRequest, as evidenced by the error message you saw.While your call technically fulfills the syntax requirements of
Invoke-WebRequest, it cannot work as intended:-User, thanks to PowerShell's "elastic syntax", prefix-matched the-UserAgentparameter, which is not your intent.Since no credentials were actually passed (which would require the
-Credentialparameter), you received the error you saw.Therefore, you have two options:
Stick with
Invoke-WebRequestand use its parameters properly.Invoke-WebRequestin PowerShell (Core) 7+, perhaps usingcurl.exeis better (see next point).Switch to
curl.exeand use its parameters properly; e.g.: