Код для входа в удаленный каталог и поиска файла и загрузки в Python через FTP - PullRequest
0 голосов
/ 03 января 2012

У меня есть пакет с расширением .gz и именем файла с расширением (xxxxxxxxxxxx_PARSERxxxxx.tar.gz), помещенный в удаленный каталог, например 1.1.1.1 (должен быть входным параметром в качестве переменной), в настоящее время я запускаю сценарий с компьютераскажем, 2.2.2.2, мне нужно поместить пакет в машину 3.3.3.3 (должен быть введен как переменный), подготовил скрипт для того же, но он не работает, пожалуйста, помогите мне на том же,

Здесьэто код, который я написал до сих пор (не работает):

#!/usr/bin/python 
#ftp.py 

import sys 
import telnetlib 
from ftplib import FTP 
import os 

def handleDownload(block): 
    file.write(block) 
    print ".", 
hstip= raw_input('Enter the hstip: ')      #ip of the machine where packages ae placed
uid = raw_input('Enter the username: ')   #uid os the machine whr packages are placed
pwd = raw_input('Enter the user password: ') #pwd of hte machine where packages are palced
path = raw_input('Enter the path where packages are present: ') #path for the packages.
rmthstip= raw_input('Enter the hstip: ')      #ip of the machine where packages to be placed
rmtuid = raw_input('Enter the username: ')   #uid os the machine whr packages to be placed
rmtpwd = raw_input('Enter the user password: ') #pwd of hte machine where packages to be palced
cwd = os.getcwd() 
os.chdir(cwd) 
logout = 'parser files downloaded succesfully' 
tn = telnetlib.Telnet(rmtip) 
tn.read_until("login: ") 
tn.write(rmtuid + "\n") 
tn.read_until("Password:") 
tn.write(rmtpwd + "\n") 
ftp=FTP(hstip,uid,pwd) 
print 'Logging in.' 
ftp.login(uid,pwd) 
ftp.cwd(path) 
parserfile = 'find . -name "*PARSER*.gz"' 
filenm = os.system(parserfile) 
print filenm 
ftp.retrbinary(' RETR ', 'filenm', logout ) 
ftp.quit() 
tn.close() 

1 Ответ

0 голосов
/ 03 января 2012

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

Быстро взглянув на него, я бы сказал, что бит perserfile и использование filenm неверны.

  1. os.system возвращает целое число, поэтому filenm - это не имя файла, а существующий статус команды поиска. Вы хотите использовать pipe = subprocess.Popen(['find', '.', '-name', '*PARSER*.gz'], stdout=subprocess.PIPE и цикл for pipe.stdout для чтения всех строк, созданных командой

  2. строка ftp.retrbinary выглядит подозрительно: вы, вероятно, хотите удалить кавычки вокруг 'filenm', чтобы использовать путь, найденный выше, и использовать функцию обратного вызова, которую необходимо исправить (см. Ниже)

  3. в handleDownload вызов file.write не будет выполнен, поскольку вы вызываете класс файла, а не объект файла

  4. Наконец, мне странно выполнять поиск в локальной файловой системе, чтобы найти путь на удаленном ftp-сервере, который выглядит как то, что делает ваш код , если у вас есть некоторые особенности вашего локального пути. Или вы пытаетесь использовать соединение telnet для удаленного поиска? IMO, если FTP-сервер позволяет вам сделать это и вы знаете удаленный путь, вам лучше установить CWD на FTP-сервере в этом каталоге, получить содержимое и найти путь, который соответствует вашим требованиям.

Загрузка сама по себе должна быть переписана как:

local_fobj = file('downloaded_file.gz', 'wb')
def download_cb(data):
    local_fobj.write(data)
ftp.retrbinary('RETR %s' % filenm, download_cb)
local_fobj.close()

Прочие разные вещи:

  1. cwd = os.getwd() и os.chdir(cwd) могут быть безопасно удалены
  2. rmtip не определено, следует rmthstip
...