Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Powershell ftp upload error 530 not logged in

Tags:

powershell

ftp

I am struggling to get a PowerShell script to work. I am very new to PowerShell so could be missing something stupid.

$sourceuri = "ftp://ftp.example.com/myfolder/myfile.xml"
$username = "user"
$password = "password"

# Create a FTPWebRequest object to handle the connection to the ftp server
$ftprequest = [System.Net.FtpWebRequest]::create($sourceuri)

$credentials = New-Object System.Net.NetworkCredential($username,$password)
# set the request's network credentials for an authenticated connection
$ftprequest.Credentials = $credentials

$ftprequest.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile
$ftprequest.UseBinary = 1
$ftprequest.KeepAlive = 0

# read in the file to upload as a byte array
$content = gc -en byte $fileName
$ftprequest.ContentLength = $content.Length
# get the request stream, and write the bytes into it
$rs = $ftprequest.GetRequestStream()
$rs.Write($content, 0, $content.Length)
# be sure to clean up after ourselves
$rs.Close()
$rs.Dispose()

I get the following error:

Exception calling "GetRequestStream" with "0" argument(s): "The remote server returned an   error: (530) Not logged in."
At C:\temp\copyfile.ps1:63 char:35
+ $rs = $ftprequest.GetRequestStream( <<<< )

I can connect via IE to it easily so thought maybe something else was wrong so did this quickly in C#:

        string filePath = @"C:\temp\myfile.xml";
        string FTPAddress = @"ftp://ftp.example.com/myfolder";
        FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(FTPAddress + "/" + Path.GetFileName(filePath));
        request.Method = WebRequestMethods.Ftp.UploadFile;
        string username = "user";
        string password = "password";
        request.Credentials = new NetworkCredential(username, password);
        request.UsePassive = true;
        request.UseBinary = true;
        request.KeepAlive = false;

        FileInfo file = new FileInfo(filePath);
        request.ContentLength = file.Length;
        int buffLength = 2048;
        byte[] buff = new byte[buffLength];
        int contentLen;

        FileStream fs = file.OpenRead();

        Stream strm = request.GetRequestStream();
        contentLen = fs.Read(buff, 0, buffLength);
        while(contentLen !=0 )
        {
            strm.Write(buff, 0, contentLen);
            contentLen = fs.Read(buff, 0, buffLength);
        }

        strm.Close();
        fs.Close();

The C# works perfectly, not sure why this isn't working and hoping someone might be able to point out my error

EDIT

Solved it, new it would be something stupid. The password had a "$" sign in it, it was within double quotes but I didn't realize it would need to be escaped, just didn't think of it at all. Ironically I had to change the password etc so that it was safe to post.

like image 789
Jon Avatar asked Feb 25 '10 12:02

Jon


3 Answers

In my case the reason was that the FTP server required SSL. Changing this property on the request solved my problem:

request.EnableSsl = true;
like image 128
Efrain Avatar answered Sep 24 '22 18:09

Efrain


From the original poster Jon:

Solved it, new it would be something stupid. The password had a "$" sign in it, it was within double quotes but I didn't realize it would need to be escaped, just didn't think of it at all. Ironically I had to change the password etc so that it was safe to post.

like image 20
Eris Avatar answered Sep 20 '22 18:09

Eris


just remove the double quote from username or password because sometimes $ sign causes problem. Its good to use single quote every time.

like image 39
Eagle Avatar answered Sep 22 '22 18:09

Eagle