Тестирование подключения к FTP-серверу с помощью PowerShell Test-Connection

2186
yazan

Я пытаюсь с этим сценарием, но он не работает для меня

$file = "test.txt"  $filePath = "C:\" + $file  $server = "ftp://server"  IF (Test-Connection -ComputerName $server -Quiet -Count 1 -ErrorAction SilentlyContinue) { $ftp = $server+$file  $webclient = New-Object System.Net.WebClient  $uri = New-Object System.Uri($ftp)  "Uploading $File..."  $webclient.UploadFile($uri, $filePath) } ELSE  

когда я запускаю скрипт, у меня появляется сообщение «ошибка» на хосте, это значит, что нет контакта с сервером, но когда я пингую сервер, ответ

1
Как это не сработало? Что это сделало? Это сделало что-нибудь? Вы получили какие-либо сообщения об ошибках? Что именно происходит? Вы можете редактировать свой вопрос, чтобы добавить детали. Mokubai 6 лет назад 1
Можно ли так же использовать Test-Connection? [Документация] (https://docs.microsoft.com/de-de/powershell/module/Microsoft.PowerShell.Management/Test-Connection?view=powershell-5.1) гласит, что она * отправляет пакеты эхо-запроса ICMP (" pings ") на один или несколько компьютеров. * и что вам нужно * Введите имена компьютеров или введите IP-адреса в формате IPv4 или IPv6 *. Что я пытаюсь сказать: ** `Test-Connection` не будет работать с` ftp: // `, но только с самим IP / URL. ** flolilolilo 6 лет назад 1
что я пытаюсь сказать, если (пинг сервера) сделать else yazan 6 лет назад 0
сначала проверьте, открыт ли порт ftp $ ftpClient = New-Object System.Net.Sockets.TCPClient; $ FtpClient.Connect ( '$ сервер', 21); $ ftpClient.Connected Antony 6 лет назад 1

2 ответа на вопрос

1
Martin Prikryl

Как уже прокомментировал @flolilolilo, the Test-Connectionпринимает имя хоста, а не URL, поэтому вы должны вызывать его serverтолько с помощью not, а не ftp://server.

Как только вы исправите это, вы столкнетесь с другой проблемой: ваш URI неверен, так как вам не хватает косой черты между serverи test.txt. URI должен быть ftp://server/test.txt.


И вообще я не вижу смысла звонить Test-Connection. Просто попробуйте загрузить файл прямо сейчас.

Мартин прав. Test-Connection не принимает URL-адреса, но имена хостов и ips (v4 и 6). Он также прав насчет «Test-Connection», так как icmp echo (ping) заблокирован во многих сетях, поэтому он может вернуть false, даже если сервер работает. Если вы хотите проверить наличие определенных открытых портов, вы можете использовать командлет `Test-NetConnection`, например,` Test-NetConnection -ComputerName ftpserver -Port 22 -InformationLevel Quiet -WarningAction SilentlyContinue` WeatherForecastingRat 6 лет назад 2
моя точка зрения: у меня есть список ftp-серверов, и я хочу загрузить один и тот же файл на все ftp-серверы, но прежде чем загружать, я должен знать, что сервер подключен к сети, поэтому я хочу, чтобы модификатор выполнял скрипт (test-connection) если сервер жив >> отправить файл, если не работает >> написать сообщение (ошибка) yazan 6 лет назад 0
Но почему? Почему бы вам просто не попробовать загрузить? И если загрузка не удалась, напишите сообщение. Никакое тестирование подключения не гарантирует вам, что загрузка все равно будет успешной. Martin Prikryl 6 лет назад 0
Потому что я хочу загрузить файл .zpl yazan 6 лет назад 0
Как это отвечает на мой вопрос? Martin Prikryl 6 лет назад 2
Потому что я хочу загрузить файл.zpl Я хочу отправить команды ZPL на многие принтеры Zebra, чтобы модифицировать имя сообщества, поэтому я хочу знать, если файл отправлять правильно, или нет, я не хочу проверять каждый IP с SNMP для проверки если название сообщества было изменено yazan 6 лет назад 0
Мы понимаем, что вы хотите загрузить файл. И еще раз: тестирование подключения не гарантирует вам, что загрузка будет успешной. Вы должны попробовать фактическую загрузку и проверить результаты, чтобы увидеть, все ли прошло хорошо. Так что нет смысла проверять подключение перед загрузкой. Просто загрузите и проверьте результаты! Martin Prikryl 6 лет назад 1
это действительно сложно, я хорошо объясню все идай - у меня есть принтер Zebra 200. Я хочу изменить все пароли и имя сообщества для всех принтеров в одном скрипте, потому что пароль по умолчанию - 1234, а имя сообщества - PUBLIC, поэтому сначала я хочу проверить если принтеры подключены к сети, то я хорошо отправляю команду yazan 6 лет назад 0
Хорошо для меня - таким образом, вы можете войти, какой принтер не реагировал. Тем не менее, мое замечание из предыдущего комментария состояло в том, что не все сетевые устройства отвечают на эхо-запрос (обычно блокируется по вторым причинам). Обычно это не так с принтерами. Если вы хотите проверить, работает ли ftp-сервер, проверьте порт, на котором работает служба (обычно 22). WeatherForecastingRat 6 лет назад 0
@WeatherForecastingRat Сейчас 21, а не 22. + Я все равно не понимаю, но дело до ОП. Martin Prikryl 6 лет назад 0
:) правильный 22 - это ssh. WeatherForecastingRat 6 лет назад 0
@MartinPrikryl Я думаю, что в этом могут быть некоторые преимущества, например, вы создаете кучу объектов в скрипте и некоторые другие ресурсоемкие задачи (не только загрузка по ftp) на каждом сервере. Вы также прогнозируете, что значительная часть ваших сетевых устройств может отсутствовать - лучше проверить соединение до того, как сократить используемые ресурсы. WeatherForecastingRat 6 лет назад 0
@WeatherForecastingRat Да, наконец-то кто-то понял мою точку зрения :) yazan 6 лет назад 0
тем не менее, я бы дополнительно попытался отследить фактическую загрузку, поскольку нет гарантии, что она будет успешной, потому что принтер включен и доступен. flolilolilo 6 лет назад 1
0
yazan

Я использую команду, get-contentчтобы получить список IP-адресов и пинговать его, если IP-адрес Live открыт FTP-сеанс и отправить файл на принтер

$printers = get-content "C:\......\servers.txt" $info="C:\CommunityName.zpl"  $ftp = "ftp://$ip/dir/CommunityName.zpl"  $user = ""  $pass = ""  $webclient = New-Object System.Net.WebClient  $webclient.Credentials = New-Object System.Net.NetworkCredential($user,$pass)   foreach ($ip in $printers){ IF (Test-Connection -ComputerName $ip -Quiet -Count 1 -ErrorAction SilentlyContinue){  try { $uri = New-Object System.Uri($ftp) $webclient.UploadFile($uri, $info) Write-Host "UploadFile it's done $ip" -backGround Green }   catch { Write-Host "An Error occured while uploading file to: $Uri" Throw  } } ELSE{ Write-Host "no conacting $ip" -backGround Red} } 
это мой оригинальный скрипт, я хочу изменить его, чтобы сначала отправить файл для изменения имени сообщества, после этого я хорошо отправляю команду SNMP для изменения всего пароля командой SNMPSET, поэтому, когда я изменяю имя сообщества, я хорошо редактирую его внутри командной строки ex private: snmpget -v1 -c private $ ip enterprises.10642.20.10.10.5.11.4.0; yazan 6 лет назад 0
так это работает сейчас? если нет: пожалуйста, измените свой вопрос, если вы хотите добавить детали - это очень запутанно, когда ответы становятся вопросами. flolilolilo 6 лет назад 0
этот скрипт работает для меня, чтобы пинговать список серверов и отправить команду SNMP, но я хочу отредактировать его, чтобы добавить строки для отправки файла zpl через FTP yazan 6 лет назад 0
используйте `System.Net.Webclient` или` System.Net.FtpWebRequest`, как в вашем вопросе - проблема была с URL-адресом против имени хоста (имя хоста переходит в `test-connection` url в` webclient`). Кроме того, вы можете установить модуль `PSFTP` и обрабатывать его с помощью командлетов. WeatherForecastingRat 6 лет назад 0
это мой последний сценарий, я его редактирую, и теперь он работает для меня, спасибо за все :) yazan 6 лет назад 0