Я знаю, что могу выполнить ls * на FTP-сервере и получить все, но существует слишком много для моего терминала (сотни страниц до сих пор). с помощью ls *> myfile не является опцией, потому что у меня нет разрешения записать. Таким образом, мне нужен способ сделать это от терминала, чего-то как: ftp ftp://site.com
Я прочитал страницы справочника, но не хочу брать на себя риск здесь. У меня нет персонального разрешения изменить этот сервер, но пользователя, которого мне дали, может иметь полномочия записи.
Я должен экспортировать это в любой локальный формат, таким образом, я могу рассматривать его со временем, поскольку существует большой вывод.
, По-видимому можно передать команду по каналу непосредственно к ftp
:
echo "ls *" | ftp hostname > ls.txt
Удостоверяются к кавычке ls *
так или иначе, или отключить globbing иначе *
расширится в текущей оболочке.
Хороший вариант мог бы состоять в том, чтобы передать вывод по каналу в меньше:
ls * | less
Тогда необходимо быть в состоянии счастливо просмотреть страницы путем прокрутки вывода, не нуждаясь ни в каких полномочиях записи файла.
Что относительно:
ncftpls -R ftp://site.com
команда Nice, разработанная для точно этой цели
я только что сделал сценарий 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()