0

.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() 
4

1 に答える 1

0

プログラムがどのように機能しないかを教えていただければ、本当に助かります。

それをざっと見てみると、 perserfile ビットと filenm の使用法が間違っていると言えます。

  1. os.system整数を返すためfilenm、ファイル名ではなく、find コマンドの存在ステータスを返します。コマンドによって生成されたすべての行を読み取る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サーバーで許可されていて、リモートパスがわかっている場合は、FTPサーバーのCWDをそのディレクトリに設定し、コンテンツを取得して、要件に一致するパスを探すことをお勧めします。

ダウンロード自体は次のように書き換える必要があります。

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
于 2012-01-03T08:01:45.417 に答える