如何在没有写权限的情况下获取递归 ftp 目录列表?

如何在没有写权限的情况下获取递归 ftp 目录列表?

我知道我可以在 ftp 服务器上运行 ls * 并获取所有内容,但对于我的终端来说,内容太多了(到目前为止有数百页)。使用 ls * > myfile 不是一个选项,因为我没有写入权限。所以我需要一种从终端执行此操作的方法,例如:ftp ftp://site.com

我已阅读手册页,但不想在这里冒险。我没有个人权限来修改此服务器,但我被授予的用户可能有写入权限。

我需要将其导出为任何本地格式,以便我可以随时查看,因为很多的输出。

答案1

显然您可以将命令直接传送至ftp

echo "ls *" | ftp hostname > ls.txt

确保以ls *某种方式引用或禁用通配符,否则*将在当前 shell 中扩展。

答案2

一个好的选择可能是将输出导入到 less 中:

ls * | less

然后,您应该能够愉快地滚动浏览输出页面,而不需要任何文件写入权限。

答案3

关于什么:

 ncftpls -R ftp://site.com

很好的命令,专为此目的而设计

答案4

我刚刚为此目的编写了一个 python 脚本: https://gist.github.com/eadmaster/55d1508bd17780ee1e93c15609bb69af

#!/usr/bin/env python

# code derived from https://gist.githubusercontent.com/flibbertigibbet/8165881/raw/7f580b6735ad1f03c6e6060cd1c8571048afad6a/recurse_ftp.py

from ftplib import FTP
from time import sleep
import os
import sys

my_dirs = []  # global
curdir = ''   # global

PROGRAM_NAME = os.path.basename(sys.argv[0])

if len(sys.argv) <= 1 or sys.argv[1].startswith("-"):
  print("usage: " + PROGRAM_NAME + " SERVER_ADDR [SERVER_ROOT_DIR]")
  sys.exit(1)
# else
SERVER_ADDR = sys.argv[1]

SERVER_ROOT_PATH = "/"
if len(sys.argv) >= 3:
  SERVER_ROOT_PATH = sys.argv[2]

def get_dirs(ln):
  global my_dirs
  cols = ln.split(' ')
  objname = cols[len(cols)-1] # file or directory name
  if ln.startswith('d'):
    my_dirs.append(objname)
  else:
    print(curdir + "/" + objname)

def check_dir(adir):
  global my_dirs
  global curdir
  my_dirs = []
  gotdirs = [] # local
  try:
    curdir = ftp.pwd()
    sys.stderr.write(PROGRAM_NAME + ": going to change to directory " + adir + " from " + curdir + "\n")
    ftp.cwd(adir)
    curdir = ftp.pwd()
    ftp.retrlines('LIST', get_dirs)
  except:
    return
  print(curdir + "/")
  gotdirs = my_dirs
  #print("found in " + adir + " directories:")
  sleep(0.5)
  for subdir in gotdirs:
    if(subdir.startswith(".")):
      continue
    my_dirs = []
    check_dir(subdir) # recurse  
  # end for
  ftp.cwd('..') # back up a directory when done here
# end of check_dir


# main
try:
  ftp = FTP(SERVER_ADDR)
  ftp.login()
  check_dir(SERVER_ROOT_PATH) # directory to start in

except:
  import logging
  logging.exception("")
  ftp.quit()

ftp.quit()

相关内容