Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Памятка по командам FTP

Автор обзора: Денис "Reagent" Ходус. Дополнено © мной

Все мы знаем сочетание буковок FTP, которое расшифровывается как File Transfer Protocol. Старая, но до сих используемая технология передачи файлов между двумя компьютерами с использованием TCP/IP сети.

Большинство из нас пользуется для работы с этим протоколом какими-либо утилитами или модулями файловых менеджеров. Но давайте представим себе ситуацию, когда нужно получить доступ к FTP-серверу через командную строку. Никаких панелей со списком файлов и кнопочками "Копировать" и "Удалить" там у Вас не будет. (Кстати, я часто именно через командную строку лажу - мне так просто даже быстрее - если приходится что-то сделать или проверить FTP.)

Итак, команда для работы с FTP как в Windows, так и в Unix (включая Linux Debian, CentOS, ubuntu, rhel, FreeBSD и т.д.) одинаковая - так и называется - "ftp".

Просто подсоединиться к определенному серверу - синтаксис тоже отличаться не будет:
Код Bash
ftp 192.168.0.1

А вот хитрости типа автологина и автоматического принятия или отсылки файлов - у разных ОС немного свои и мы здесь их разбирать не будем. Зато разберем - что же через командрую строку все-же сделать можно в самой сессии - и сами команды, конечно.

Итак, начнем. В этой памятке приведены самые часто используемые команды, которые позволят Вам свободно общаться с любым сервером с любым набором опций.


Команды

Открываем консоль. Запускаем нашу утилиту, введя буквы ftp
Видим на экране приглашение:
Код Bash
ftp>

HELP

Выдает список поддерживаемых команд


? имя команды

Получение короткого описания указанной команды.


OPEN

Присоединиться к указанному серверу (пишем его имя либо IP-адрес).
Также можно указать порт через пробел. По-умолчанию используется стандартный - 21.
Код Bash
ftp> open ftp.microsoft.com

При этом сервер Вас спросит логин и пароль.


CLOSE или DISCONNECT

Закрыть соединение с текущим FTP сервером.
Код Bash
ftp> close

BYE или QUIT

Закрыть соединение и выйти из утилиты FTP.
Код Bash
ftp> bye

USER

Залогиниться на данном сервере под указанным пользователем (Вы должны быть уже подключены).
Код Bash
ftp> user myusername

где вместо "myusername" подставьте имя пользователя, под которым логинитесь. FTP-сервер Вас спросит пароль для этого пользователя перед тем, как пустить.


LS или DIR

Показать список файлов и директорий в текущей папке на сервере.
Код Bash
ftp> ls

MLS или MDIR

Выгрузить список файлов из нескольких директорий в файл на Ваш компьютер.
Код Bash
ftp> mls dir1 dir2 dir3 mylocalfile.txt

CD

Перейти в указанную папку на сервере.
Код Bash
ftp> cd ../another/folder
Частный случай этой команды: CDUP - перейти в родительскую директорию - то же самое, что и "CD ..":
Код Bash
ftp> cdup

LCD

Перейти у указанную папку на Вашем компьютере.
Код Bash
ftp> lcd d:\temp

PWD

Показать текущий путь (текущую папку) на FTP сервере.
Код Bash
ftp> pwd

GET или RECV

Загрузить с FTP сервера в текущую папку Вашего компьютера указанный файл.
Код Bash
ftp> get myftpfile.txt

MGET

Загрузить несколько файлов в текущую папку Вашего компьютера с сервера FTP.
Код Bash
ftp> mget file1.txt file2.txt
mget file1.txt? y
mget file2.txt? y

NEWER

Загрузить с сервера FTP на Ваш компьютер указанный файл только если Ваш файл старее (т.е. удаленный файл свежее).
Код Bash
ftp> newer myfile1 myfile1

Здесь первый аргумент - имя файла на сервере, а второй аргумент - имя файла на Вашем компьютере.


PUT или SEND

Загрузить на FTP сервер указанный файл с Вашего компьютера.
Код Bash
ftp> put mylocalfile.txt

MPUT

Загрузить на сервер несколько файлов с Вашего компьютера.
Код Bash
ftp> mput myfile1.txt myfile2.txt
mput myfile1.txt? y
mput myfile2.txt? y

DELETE

Удалить указанный файл на сервере.
Код Bash
ftp> delete remotefile.txt

MDELETE

Удалить несколько файлов на сервере.
Код Bash
ftp> mdelete file1 file2

MKDIR

Создать директорию на сервере.
Код Bash
ftp> mkdir mynewdir

RMDIR

Удалить директорию на сервере
Код Bash
ftp> rmdir mydir

PROMPT

Избавляет от необходимости подтверждать получение файлов по маске нажатием клавиши "Y".


HASH

Отображает индикацию загрузки файлов с помощью меток хеширования (#).
Одна такая метка, по-умолчанию = 2048 байт.
Нужно для того, чтобы видеть - не подвисло ли получение больших файлов.


BINARY

Установка режима передачи данных в двоичном формате (подходит для любых типов файлов).


Пример сессии FTP

Вот пример короткой FTP сессии, в которой мы подключаемся к серверу, создаем папку "newfiles" и заливаем в эту папку файл "binfile.bin".

Код Bash
ftp
ftp> open 31.170.155.55 21
ftp> Anonymouse
ftp> 
ftp> mkdir newfiles
ftp> cd newfiles
ftp> put "c:\binfile.bin"
ftp> bye

Для автоматизации рутинной работы можно создать текстовой файл со списком команд, например FTPCommand.txt а затем выполнить код:
Код Bash
ftp.exe -s:FTPCommand.txt

Для успешного подключения к серверу утилита FTP.exe не должна блокироваться Вашим брандмауером.
Для внесения в список исключений встроенного в ОС Windows можно выполнить код:
Код Bash
netsh firewall add allowedprogram "%windir%\system32\ftp.exe" ENABLE

Данный код подходит, как для Windows XP, так и Windows 7.


Ссылки на другие темы с готовыми реализациями:

Ответ: FTP команды сервера на Linux-е



Добавлено через 3 минуты
Вопрос: Как записать исключение определённых строк в шаблоне поиска команды FINDSTR?

Друзья!
Есть файл foo.txt:
Nmap 12
Nmap 13
Nmap 125
Nmap 135
Нужно исключить из него строки, которые "Nmap 12" и "Nmap 13"; поехали:

Windows Batch file
1
findstr /V /C:"Nmap 12$" | findstr /V /C:"Nmap 13$" foo.txt
Команда, несомненно, правильная. Действительно, сначала мы ищем подстроку "Nmap 12", которая примыкает к концу строки. Это ТОЛЬКО "Nmap 12", но не "Nmap 125"; "Nmap 12" и исключаем из вывода (/V); те же соображения относительно строки "Nmap 13"

Но мало того, что выводится весь файл, так ещё и команда не заканчивается на этом; то есть новую команду не набрать! Приглашения на ввод новой команды отсутствует и это вообще меня в холодный пот бросает! ЧЯДНТ? Спасибо, кто откликнется.

Добавлено через 22 минуты
А вот тут мне подсказали в соседней теме, что при использовании регулярных выражений нужно использовать ключ /R

Windows Batch file
1
findstr /V /R /C:"Nmap 12$" | findstr /V /R /C:"Nmap 13$" foo.txt 
Вывод:
Windows Batch file
1
2
3
Nmap 12
Nmap 125
Nmap 135
Почему Nmap 12 не исключилось из поиска- непонятно. Кроме того, вывод новой команды по-прежнему невозможен!
Ответ: 1)
Сообщение от kravam
А вот тут мне подсказали в соседней теме, что при использовании регулярных выражений нужно использовать ключ /R
.

Угу. Ключ /C: при использовании регулярных выражений должен использоваться в команде совместно с ключом /R в отличие от команды без ключа /C:, в которой шаблон поиска рассматривается по умолчанию как регулярное выражение.

2)
Сообщение от kravam
... новую команду не набрать!
Расположение имени файла в строке команд должно быть другим.

Таким образом, будет работать такая команда:
Windows Batch file
1
findstr /R /V /C:"Nmap 12$" foo.txt | findstr /R /V /C:"Nmap 13$" 
.

3) Допускается множественное использование ключа /C: с разными поисковыми шаблонами.

Поэтому команду можно записать короче:
Windows Batch file
1
findstr /R /V /C:"Nmap 12$" /C:"Nmap 13$" foo.txt
.
Вопрос: BAT команда для вырезания в буфер обмена

Здравствуйте.
Помогите с написанием bat команды для вырезания 1-ой строки из файла 1.txt в буфер обмена. Или в другой файл 2.txt.
например у нас есть файл 1.txt с строками(строки разные по размеру):
1(строка)21.asf.g
2(строка)6436.dgfdj.j
3(строка)asdf.hda.aad
4(строка)3453.fj.89

после вырезания нужно чтобы было так 1.txt:
1(строка)6436.dgfdj.j
2(строка)asdf.hda.aad
3(строка)3453.fj.8

и т. д.

нашел вот такой код:


Windows Batch file
1
2
3
4
5
6
7
8
9
10
@Echo Off
For /F "Tokens=*" %%A In (1.txt) Do Call :_Func "%%A"
Exit /B 0
 
:_Func
  Set "Str=%~1"
  If "%Str:~1%"=="" Exit /B
  Set "Str=%Str:~1%"
  Set "Str=%Str:  =$%"
  For /F "Tokens=1 Delims=$" %%A In ("%Str%") Do Echo.%%A>>b.txt

но он копирует в другой файл все строки.

Заранее спасибо за ответы.
Ответ: Как было справедливо отмечено
Сообщение от Garry Galler
Нет такой команды как "вырезать в буфер обмена" - cmd это не текстовый редактор чтобы что-то откуда-то куда-то вырезать.
Однако существуют текст. редакторы, которые понимают внешние команды.


Команды для вырезания произвольных строк файла в буфер обмена
с использованием возможностей интерфейса ком. строки текстoвого редактора vim

Эта команда вырежет в clipboard 5-ю строку файла file.txt:
Windows Batch file
1
vim +"5d*" +x file.txt
Эта команда вырежет в clipboard последнюю строку файла file.txt:
Windows Batch file
1
vim +"$d*" +x file.txt
Эта команда вырежет в clipboard три последних строки файла file.txt:
Windows Batch file
1
vim +"$-3,$d*" +x file.txt
Эта команда вырежет в clipboard целиком секцию [USER] из файла config.ini:
Windows Batch file
1
vim +"/\[USER\]/,/\n$/ d*" +x config.ini
Эта команда отправит в clipboard весь файл file.txt:
Windows Batch file
1
vim +"1,$d*" +x file.txt
А эта команда вставит вырезанную секцию в конец файла config.2.ini
Windows Batch file
1
vim +$pu* +x config2.ini
Вопрос: Запуск команды от имени администратора из батника

как можно выполнить команду в cmd от имени администратора, при этом не запуская саму cmd от имени администратора, или через cmd запустить cmd от имени администратора и в ней сразу выполнит команду
(например чтобы в команде [cmd.exe /k taskkill /f /im] taskkill выполнилась от имени администратора)
Ответ: Luchezarnaja, здравствуйте!

1) Запустите командную строку "От имени Администратора".
2) Введите команду:
Windows Batch file
1
openfiles /local on
3) Перезагрузите систему.
4) Запустите командную строку "От имени Администратора".
5) Введите команду:
Windows Batch file
1
openfiles | find /i ".mkv"
В списке будет выведено имя программы, которая отрыла файлы MKV.

Перед удалением файла, необходимо закрыть эту программу, либо дать указание разблокировать конкретный файл с помощью команды:
Windows Batch file
1
openfiles /disconnect /op "полный путь.mkv" /a *
где вместо полный путь.mkv нужно подставить свой, например: C:\Users\Alex\Desktop\video.mkv
Вопрос: Отправить команду из командной строки на локальный принтер

Всем доброго дня!  
 
Не могу отправить на порт принтера файл 5.prn следующего содержания:
#%-12345X@PJL
@PJL DEFAULT DENSITY=5
#%-12345X
...из командной строки в Windows XP командой  
copy /b имя_файла имя_принтера
этот файл не отправляется на принтер (пробовал имя принтера и порт подставлять вместо имя_принтера), а в том же разделе (папке), где находится файл 5.prn, возникает файл с именем имя_принтера — т.е. файл 5.prn копируется в другой файл :(
 
Принтер HP LaserJet 1320 (не сетевой!) подключен через USB (в свойствах принтера указан порт DOT4_002); можно подключить через LPT (тогда будет порт DOT4_001); операционка Windows XP SP3 32-bit.
 
Нужно не распечатать этот файл, а отправить на принтер команду. Команда, записанная в файле 5.prn, должна увеличить плотность печати (т.е. количество тонера, которое высыпается на лист) — это значение меняется от 1 до 5, по умолчанию (сейчас)=3, а нужно изменить его на 5.
 
UPD: проблема с отправкой файла на принтер, похоже, решилась подключением принтера через LPT и командой
copy /b имя_файла LPT1
(несмотря на то, что в свойствах принтера порт указан  DOT4_001) однако..... плотность печати не меняется. Вопрос: этот файл 5.prn должен быть не текстовым? Его нужно чем-то скомпилировать? Как и чем?
 
Если отправлять на принтер текстовый файл  
#%-12345X@PJL
@PJL DEFAULT DENSITY=5
#%-12345X
то через несколько минут ожидания принтер распечатывает текст
#%-12345X@PJL
@PJL DEFAULT DENSITY=5
#%-12345X
...а если этот текстовый файл предварительно перевести в бинарный вид "печатью в файл" (не знаю, правильно ли это) то после отправки его на принтер этот текст распечатывается сразу. Плотность печати никак не меняется (пробовал "...DENSITY=5" и "...DENSITY=1")
 
Как же отправить команду на изменение плотности печати?
Ответ: Проблема решилась заменой "#" в обеих строках на "1B" (hex) в текстовом редакторе с возможностью бинарного редактирования HxD. После этого команды на изменение плотности печати заработали.  
 
Всем спасибо за внимание :)
Вопрос: Команда перенаправления

Добрый день.
Вопрос, ведь конвейеризация означает, что вывод 1 команды служит вводом для второй, почему если набираешь
Windows Batch file
1
assoc .txt | ftype 
то выдает все сопоставления, не только txtfile.
Ведь по идее я вывод команды assoc(txtfile) перенаправляю команде ftype.
Ответ:
Сообщение от MakMed
по идее я вывод команды assoc(txtfile) перенаправляю команде
Команда ftype не принимает данные из конвейера.
PS: И вы ей не тип файла передаете. Но это уже не важно.
Вопрос: Использование команды Chdir (Cd)

Заметил, что некоторые используют такую команду:
Windows Batch file
1
CD /d "%~dp0."
т.е. ставят точку в конце. Зачем это делается? без точки в конце в каких-то случаях может некорректно сработать?
Ну и еще вопрос про использование батника, если он находится в сети. Я так понимаю такая команда не будет работать, т.к. cd не поддерживает unc-пути. Какую тогда лучше использовать команду? pushd/popd? Только вот читал о них и не совсем понял как правильно их использовать.
Ответ:
Сообщение от b0gus
%~dp0 путь к текущей папке выдаёт с завершающим слешем "", в некоторых ОС такой формат для CD считается неверным
Где-то слышал об этом, но на практике не встречал.
Сообщение от V1RTuE
батник будет распологаться в сети (на сервере) и все прописанные в батнике команды будут выполняться на нем же (запускаться же батник будет с разных локальных машин, которые находятся в одной сети)
Не лишним будет перепроверить что выдает на сервере батник:
Windows Batch file
1
2
echo dp0 = %~dp0
echo cd = %cd%
если его запустить, используя локальную машину.

Скорее %~dp0 выдаст нечто вроде \\host\share
Так что подставлять эту конструкцию еще и в другие команды (кроме cd /d (chdir)), не стоит.
Вопрос: Не могу вызвать командой HELP список команд CMD

Не могу вызвать список команд через help
Ответ: Да много чем отличается.

1. Не удаляется старый неверный ключ, как следствие ошибка (конфликт) никуда не девается.
2. Раскрываются переменные окружения, как прописанные в консоль (полбеды), так и те, что сейчас внутри %Path% из-за механизма REG_EXPAND_SZ, из-за чего повреждается одна из них (та что прописана через %LOCALAPPDATA%), через команду Path Вы этого не видите.
3. Пишется лишний мусор, потому что такую команду нужно было писать только первый раз.
Ну и для приличия кавычек не хватает. Если бы у Вас в Path был хоть один пробел, эта команда не сработала бы.
Вопрос: После выполнения определённой команды не выполняются последующие команды

Объясните, пожалуйста, почему может останавливаться выполнение второй и далее комманд?

Windows Batch file
1
2
3
4
cd C:\Users\alex_iv\Desktop\test_node\
node app.js
forever start app.js -w
pause
Здесь срабатывает только запуск node.js, любые команды далее игнорируются.

Добавлено через 2 часа 26 минут
Забыл уточнить, что это

Windows Batch file
1
cd C:\Users\alex_iv\Desktop\test_node\ & node app.js & forever start app.js -w & pause
тоже пробовал, и в этом виде так же выполнялась только первая команда
Ответ: В консоли nodejs после запуска не дает дальше вводить команды пока не нажмешь CTRL+C. В этом, видимо, все дело, node не завершает задачу, поэтому следующие команды не проходят.

Добавлено через 18 минут
Короче, просто меняем последовательность чтобы nodejs всегда запускался последним
Windows Batch file
1
cd C:\Users\alex_iv\Desktop\test_node\ && forever start app.js && node app.js
Вопрос: Запуск консольных команд из командной строки

Добрый вечер. Столкнулся с двумя проблемами при использовании командной строки:

1) Команда start находит и запускает файл exe только если прописан полный путь к нему или если он в папке прописанной в path. Но если он в подпапке находящейся внутри папки прописанной в path, то эта команда уже не находит и не запускает файл exe. Возможно ли как то научить программу start искать и запускать файлы exe не только в папке прописанной в path но и во всех подпапках находящихся внутри этой папки?

2) Окно консольной программы запущенной из командной строки, так же как и при двойном клике на exe файле, появляется на долю секунды и тут же исчезает. Как этого избежать? Есть ли какой-либо ключ к команде start который оставляет окно консольной программы открытым после её выполнения? В ряде статей видел упоминание ключа /K но при попытке ввести команду start /K имя_файла появляется надпись: Недопустимый ключ "/K"

Мне почему то кажется что обе проблемы имеют простое решение, однако его как то не просто нагуглить

Если это имеет значение: операционная система Windows 7 Домашняя Расширенная SP1 64-бит Запускаемые мной программы это консольные приложения Win32 написанные на чистом С
Ответ:
Сообщение от SpiderHulk
если он в подпапке находящейся внутри папки прописанной в path
В относительной подпапке на 1 уровень выше?

1) Только если написать обёртку вокруг PATH.

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@echo off
SetLocal EnableExtensions
 
set "file=MemFree5.exe"
 
where "%file%" && (start "" cmd /k "%file%" goto ext)
 
set "p=%PATH:;=" "%"
 
set "FOUND="
For %%a in ("%p%") do for /d %%d in ("%%~a\*") do if exist "%%d\%file%" (start "" cmd /k "%%d\%file%" & set FOUND=true& goto ext)
:ext
if not defined FOUND echo Не найдено.
 
pause
Сообщение от SpiderHulk
В ряде статей видел упоминание ключа /K но при попытке ввести команду start /K имя_файла появляется надпись: Недопустимый ключ "/K"
Ключ нужно добавлять к cmd, а не Start. См. код выше.