Próbuję uruchomić skrypt PowerShell. Jestem bardzo nowy w PowerShell, więc może zabraknąć czegoś głupiego.Powershell ftp błąd przesyłania 530 niezalogowany
$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()
pojawia się następujący błąd:
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(<<<<)
mogę połączyć poprzez IE do niego łatwo tak, że może jeszcze coś było nie tak, więc zrobił to szybko w 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# działa idealnie, nie wiem, dlaczego to nie działa i mam nadzieję, że ktoś może wskazać mój błąd.
EDIT
Rozwiązał to, nowe byłoby coś głupiego. Hasło zawierało znak "$", zawierało się w podwójnych cudzysłowach, ale nie zdawałem sobie sprawy, że trzeba uciec, ale w ogóle o tym nie myślałem. Jak na ironię musiałem zmienić hasło itp., Aby można było bezpiecznie publikować.
Nic nie widzę. Jedyna różnica polega na tym, że używasz rozwiązania "UsePassive" w swoim C#. Aby uniknąć błędów, możesz użyć 'Set-StrictMode -version ...', aby uniknąć niezainicjowanych zmiennych (= literówek), ale w tym przypadku myślę, że nie przyniesie nic nowego. – stej
Cześć Stej, dzięki za odpowiedź. Cieszę się, że to nie tylko ja, próbowałem replikować C# w PowerShell. – Jon
Wiele błędów prowadzi do "problemu $" z podwójnymi cudzysłowami :) – stej