Как получить рекурсивный список каталогов ftp без полномочий записи?

Я знаю, что могу выполнить ls * на FTP-сервере и получить все, но существует слишком много для моего терминала (сотни страниц до сих пор). с помощью ls *> myfile не является опцией, потому что у меня нет разрешения записать. Таким образом, мне нужен способ сделать это от терминала, чего-то как: ftp ftp://site.com

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

Я должен экспортировать это в любой локальный формат, таким образом, я могу рассматривать его со временем, поскольку существует большой вывод.

2
задан 23 June 2015 в 00:18

4 ответа

, По-видимому можно передать команду по каналу непосредственно к ftp:

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

Удостоверяются к кавычке ls * так или иначе, или отключить globbing иначе * расширится в текущей оболочке.

3
ответ дан 2 December 2019 в 01:33

Хороший вариант мог бы состоять в том, чтобы передать вывод по каналу в меньше:

ls * | less

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

2
ответ дан 2 December 2019 в 01:33

Что относительно:

 ncftpls -R ftp://site.com

команда Nice, разработанная для точно этой цели

2
ответ дан 2 December 2019 в 01:33

я только что сделал сценарий 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()

1
ответ дан 2 December 2019 в 01:33

Другие вопросы по тегам:

Похожие вопросы: