缺点是我需要一个程序将所有txt文件从本地目录通过sftp上传到特定的远程目录。如果我从sftp命令行运行mput * .txt,而我已经在正确的本地目录中,那就是我正在拍摄的内容。
这是我尝试的代码。我运行它时没有错误,但是当我sftp到服务器并且上传目录时它没有结果,它是空的。我可能在一起咆哮着错误的树。我看到其他解决方案,如lftp在bash中使用mget ...但我真的希望这与python一起使用。无论哪种方式,我还有很多需要学习的东西。这是我在阅读了一些stackoverflow用户建议的内容之后想出来的,一些可能有用的库。我不确定我能用subprocess进行“for all in allfiles:”。
import os
import glob
import subprocess
os.chdir('/home/submitid/Local/Upload') #change pwd so i can use mget *.txt and glob similarly
pwd = '/Home/submitid/Upload' #remote directory to upload all txt files to
allfiles = glob.glob('*.txt') #get a list of txt files in lpwd
target="user@sftp.com"
sp = subprocess.Popen(['sftp', target], shell=False, stdin=subprocess.PIPE)
sp.stdin.write("chdir %s\n" % pwd) #change directory to pwd
for i in allfiles:
sp.stdin.write("put %s\n" % allfiles) #for each file in allfiles, do a put %filename to pwd
sp.stdin.write("bye\n")
sp.stdin.close()
答案 0 :(得分:0)
当您遍历allfiles
时,您没有传递迭代器变量sp.stdin.write
,而是传递allfiles
本身。它应该是
for i in allfiles:
sp.stdin.write("put %s\n" % i) #for each file in allfiles, do a put %filename to pwd
在发出命令之前,您可能还需要等待sftp
进行身份验证。您可以从流程中读取stdout,或者在代码中添加time.sleep
个延迟。
但为什么不使用scp
并构建完整的命令行,然后检查它是否成功执行?类似的东西:
result = os.system('scp %s %s:%s' % (' '.join(allfiles), target, pwd))
if result != 0:
print 'error!'
答案 1 :(得分:0)
您无需迭代allfiles
sp.stdin.write("put *.txt\n")
就够了。您指示sftp一次性放置所有文件,而不是逐个放置。