【问题标题】:Deleting files using ftp使用 ftp 删除文件
【发布时间】:2011-03-22 12:47:13
【问题描述】:

我开发了一个 shell 脚本来将文件从源复制到目标,同时删除源中复制的文件。我可以复制文件,但无法在源端删除文件。

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 中尝试过,但它提示输入用户名和密码

【问题讨论】:

    标签: shell unix ftp


    【解决方案1】:
    files=`ls filename`
    

    在命令周围加上反引号,而不是简单的引号来获得它的输出。

    我也尝试过 ssh,但它提示输入用户名和密码 - 检查 SSH-Login without password

    【讨论】:

      【解决方案2】:

      使用输入流直接向ftp 编写 FTP 命令脚本通常是个坏主意:它缺乏任何错误处理,它可能会完全出错,而且你没有机会控制它。如果您有机会使用更健全的命令行客户端,例如lftpcurl 或类似的可编写脚本的客户端。

      另外,使用

      遍历文件是一个非常糟糕的主意
      files=`ls files`
      for file in $files
      

      稍微好一点的解决方案是:

      for file in *

      但它不能扩展:如果*(或ls 输出)的扩展超过命令行缓冲区,它将失败。一个相当可扩展的解决方案类似于:

      find . | while read file do
        do_something_with $file
      done

      ...但这可能不是您想要的。实际上,如果您只是想将文件从源传输到目标然后在源删除文件,您可以使用lftpmput 命令和-E 选项在传输后删除文件,或者类似@987654332 @。

      【讨论】:

        【解决方案3】:

        全面的解决方案:

        换行

        `rm -rf $file` 
        

        `!rm -rf $file`
        

        这是因为,在到达EOFD 字符串之前,在代码中的那个位置,您在ftp 控制台上,因此要在本地系统(源)上运行任何命令,您需要在! 前加上前缀。

        最好的测试方法是手动执行命令。这是我测试过的:

        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:~$ 
        

        或其他解决方案,

        在完成完整的 ftp 后,再次使用相同的 for 循环来遍历同一组文件并删除它们。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-13
          相关资源
          最近更新 更多