Удаление файлов с использованием ftp - PullRequest
0 голосов
/ 22 марта 2011

Я разработал сценарий оболочки для копирования файлов из источника в место назначения и одновременного удаления скопированных файлов в источнике.Я могу скопировать файлы, но файлы не могут быть удалены на стороне источника.

files='ls filename'
for file in $files
do
ftp -vn $hostname <<EOFD
  quote USER $username
  quote PASS $password
binary
 cd $start_dir
 rm -rf $file
quit
EOFD
done
  • Я получил сообщение об ошибке: «Такие файлы или каталоги не найдены»
  • При установке ftp внеforloop также я получил ошибку как «неверная команда»
  • Я также пытался в SSH, но он запрашивает имя пользователя и пароль

Ответы [ 3 ]

0 голосов
/ 22 марта 2011

Создание сценариев FTP-команд с использованием входного потока непосредственно на ftp - это, как правило, плохая идея: в нем отсутствует какая-либо обработка ошибок, он может полностью ошибаться и у вас нет шансов управлять им.Если у вас есть возможность использовать клиент командной строки saner, такой как lftp, curl или аналогичный сценариев.

Кроме того, очень плохая идея перебирать файлы с помощью

files=`ls files`
for file in $files

Несколько лучшее решение:

for file in *

, но оно не масштабируется: если * (или вывод ls) расширится больше, чем буфер командной строки, произойдет сбой.Довольно масштабируемое решение выглядит примерно так:

find . | while read file do
  do_something_with $file
done

... и все же это, вероятно, не то, что вы хотите.Фактически, если вы просто хотите перенести файлы из источника в место назначения, а затем удалить файлы в источнике, вы можете просто использовать lftp с командой mput и опцию -E для удаления файла после передачи или что-то подобное с rsync --remove-source-files.

0 голосов
/ 19 мая 2012

Полностью защищенное решение:

Заменить строку

`rm -rf $file` 

с

`!rm -rf $file`

Это связано с тем, что в этом месте кода, который находится на консоли ftp, пока не будет достигнута строка EOFD, поэтому для запуска любой команды в локальной системе (исходном коде) необходимо указать префикс !.

Лучший способ проверить это вручную выполнить команды. Вот что я проверил:

mtk4@laptop:~$ ftp XXX.XXX.XXX
Connected to static-XX-XX-XX-XX.XXXXXX.com.
220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
220-You are user number 2 of 50 allowed.
220-Local time is now 07:52. Server port: 21.
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
Name (XXXXXX.XXX:XXX): XXXXXXX 
331 User XXXXXXX OK. Password required
Password:
230 OK. Current restricted directory is /
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> lcd test/
Local directory now /home/mtk4/test
ftp> pwd
257 "/" is your current location
ftp> !pwd
/home/mtk4/test
ftp> !ls
sample.txt
ftp> !rm sample.txt 
ftp> !ls
ftp> bye
221-Goodbye. You uploaded 0 and downloaded 0 kbytes.
221 Logout.
mtk4@laptop:~$ 

Или другое решение,

снова используйте то же самое для цикла loop, после того, как завершен ftp, чтобы перебрать тот же набор файлов и удалить их.

0 голосов
/ 22 марта 2011
files=`ls filename`

Поставьте галочки, а не простые кавычки вокруг команды, чтобы получить ее вывод.

Я также пытался в ssh, но он запрашивает имя пользователя и пароль - проверьте SSH-логин без пароля .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...