我正在使用python 3.3.2和pysftp制作一个备份实用程序,该实用程序将文件副本存储在网络上的另一台计算机上。
我已经知道如何使用pysftp传输这些文件,但是我想查看传输的进度(每秒字节数,完成百分比,剩余时间),而不是一些表示传输已开始或完成的静态打印语句
可能是这样(文件名:3.4MiB / s | 40%<########## =============> |剩余0:03:54)
编辑:如果我只知道如何获取pysftp的put命令来生成信息,我可能会建立一个进度条,这就是我想知道的操作
编辑:我认为经过大量挖掘,我在另一个问题上找到了答案:
我正在尝试连接到SFTP服务器。我有一个私钥和一个密码。我尝试阅读有关SO的相关问题,但无法成功连接。
这是我尝试过的:
pysftp.Connection(host=<hostname>, username=<username>,
password=<password>, private_key=<path to .ppk file>)
Run Code Online (Sandbox Code Playgroud)
AuthenticationException:验证失败
pysftp.Connection(host=<hostname>, username=<username>,
private_key_pass=<password>, private_key=<path to .ppk file>)
Run Code Online (Sandbox Code Playgroud)
SSHException:不是有效的DSA私钥文件
但是,我可以使用相同的凭据并与FileZilla连接。FileZilla要求输入密码,然后将该.ppk文件转换为不受保护的文件。
我尝试使用与FileZilla中使用的主机名,用户名和密钥文件相同的主机名,用户名和密钥文件,但我仍然遇到错误。还尝试使用Paramiko连接。
我正在尝试通过以下方式连接到远程主机pysftp:
try:
with pysftp.Connection(inventory[0], username='transit',
private_key='~/.ssh/id_rsa.sftp', port=8055) as sftp:
sftp.put('/home/me/test.file')
except Exception, err:
print sys.exc_info()
print err
Run Code Online (Sandbox Code Playgroud)
但是,我提出了一个奇怪的异常,无法找到更多详细信息。
(<class 'paramiko.ssh_exception.SSHException'>, SSHException('Bad host key from server',), <traceback object at 0x7fa76269c5a8>)
Bad host key from server
Run Code Online (Sandbox Code Playgroud)
我发现一个相关的问题,建议我运行ssh-keygen -R [host]以替换known_hosts文件中的密钥-完成此操作后,我会收到一个新错误:
(<class 'paramiko.ssh_exception.SSHException'>, SSHException('No hostkey for host abc.com found.',), <traceback object at 0x7f6b8520cb48>)
No hostkey for host abc.com found.
Run Code Online (Sandbox Code Playgroud)
现在,如果我尝试通过ssh连接到该主机,它会再次提示我信任要放回我的known_hosts文件中的密钥,该密钥被我接受并且可以愉快地shsh到盒子上。完成此步骤后,如果尝试再次运行脚本,则会收到原始错误Bad host key from server。
我在这里做错什么了吗?
ninja edit:我应该提一下,以下内容在终端上可以正常工作:
sftp -i .ssh/id_rsa.sftp -oPort=8055 user@host.com
sftp> …Run Code Online (Sandbox Code Playgroud) 我需要一些帮助,当我尝试连接时收到以下消息。我正在执行的脚本如下。关于如何解决此问题的任何建议?
此外,一旦我解决了这个问题,我希望向此脚本添加侦听功能,直到结果文件可用并从不同的远程目录下载它。
先感谢您
No hostkey for host mysftpserver.com found.
Exception AttributeError: "'Connection' object has no attribute
'_sftp_live'" in <bound method Connection.__del__ of <pysftp.Connection
object at 0x101d8cd50>> ignored
Process finished with exit code 0
Run Code Online (Sandbox Code Playgroud)
脚本
import pysftp as sftp
def sftpExample():
try:
s = sftp.Connection(host='mysftpserver', port=1211, username='myusername', password='mypassword')
remotepath='/Orders/incoming/myfile.csv'
localpath='/Users/myusername/projects/order88.csv'
s.put(localpath,remotepath)
s.close()
except Exception, e:
print str(e)
sftpExample()
Run Code Online (Sandbox Code Playgroud) 尝试使用 ssh 将文件从 Internet 上传到我的服务器。有以下代码可以很好地上传本地文件,但我不知道还需要做什么才能上传图片字节对象。
from io import BytesIO
import requests
import pysftp
url = 'https://vignette.wikia.nocookie.net/disney/images/d/db/Donald_Duck_Iconic.png'
cnopts = pysftp.CnOpts()
cnopts.hostkeys = None
response = requests.get(url)
netimage = BytesIO(response.content) #imagefromurl
srv = pysftp.Connection(host="12.34.567.89", username="root123",
password="password123",cnopts=cnopts)
with srv.cd('/var/www'): #srvdir
#srv.put('C:\Program Files\Python36\LICENSE.txt') #local file test
srv.put(netimage)
print('Complete')
Run Code Online (Sandbox Code Playgroud) 正如标题所示,我正在尝试获取目录中所有文件和目录的列表,包括它们的属性(我正在寻找至少名称、大小、上次修改时间,以及它是文件还是文件夹) 。我在 Windows 上使用 Python 3。
我已经尝试过listdir(),并且得到了没有属性的文件列表。我已经尝试过了listdir_attr(),我得到了一个属性列表,但没有文件名 - 而且我没有看到任何保证这两个列表的顺序相同的内容,所以据我所知,我不能只处理两个列表放在一起。
即使我最终得到一个看起来像常规 FTP/Linuxls列表的大字符串,也没关系,我可以稍后解析它。我只需要包含每个文件或文件夹以及至少我正在寻找的每个文件或文件夹的属性。
这是一个示例程序。连接值有效,可用于测试,这是一个公共测试SFTP服务器。
import pysftp
cnopts=pysftp.CnOpts()
# - I know this next line is insecure, it's just for this test program and
# just to get a directory listing.
cnopts.hostkeys = None
print('Connecting...')
with pysftp.Connection('test.rebex.net', username='demo', password='password',
cnopts=cnopts) as SFTP:
mydirlist = SFTP.??????
# ^^^^^^ What goes here?
print('Result:')
print(mydirlist)
Run Code Online (Sandbox Code Playgroud) 我试图使用 SFTP python 库将文件发送pysftp到远程邮箱服务器。但是当我尝试放置文件时出现此错误:
我正在使用 python 3.7.4
Traceback (most recent call last):
File "SFTP.py", line 54, in <module>
srv.put('file.zip','file.zip')
File "C:\Users\HP\Anaconda3\lib\site-packages\pysftp\__init__.py", line 364, in put
confirm=confirm)
File "C:\Users\HP\Anaconda3\lib\site-packages\paramiko\sftp_client.py", line 759, in put
return self.putfo(fl, remotepath, file_size, callback, confirm)
File "C:\Users\HP\Anaconda3\lib\site-packages\paramiko\sftp_client.py", line 723, in putfo
"size mismatch in put! {} != {}".format(s.st_size, size)
OSError: size mismatch in put! 4628344 != 330596
Run Code Online (Sandbox Code Playgroud)
PS:我尝试使用另一台远程服务器,它工作得很好。这是我的代码
import pysftp
import os
cnopts = pysftp.CnOpts()
hostkeys = None
host="host.com"
username=username
password=password
if cnopts.hostkeys.lookup(host) == None: …Run Code Online (Sandbox Code Playgroud) 当用SFTP上传100个每个100字节的文件时,这里需要17秒(建立连接后,我什至没有计算初始连接时间)。这意味着仅传输 10 KB 就需要 17 秒,即 0.59 KB/秒!
我知道向open、write、close等发送 SSH 命令可能会产生很大的开销,但是,在使用 SFTP 发送许多小文件时,有没有办法加快该过程?
或者特殊模式paramiko或者/pysftp将所有要执行的写入操作保留在内存缓冲区中(假设最后 2 秒的所有操作),然后在 SSH/SFTP 的一次分组传递中执行所有操作?这将避免每次操作之间等待 ping 时间。
笔记:
import pysftp, time, os
with pysftp.Connection('1.2.3.4', username='root', password='') as sftp:
with sftp.cd('/tmp/'):
t0 = time.time()
for i in range(100):
print(i) …Run Code Online (Sandbox Code Playgroud) 我有一个脚本,用于定期通过 SFTP 检索特定文件。有时,脚本会出错并显示以下输出:
Traceback (most recent call last):
File "ETL.py", line 304, in <module>
get_all_files(startdate, enddate, "vma" +
foldernumber + "/logs/", txtype[1] + single_date2 + ".log", txtype[2] +
foldernumber + "\\", sftp)
File "ETL.py", line 283, in get_all_files
sftp.get(sftp_dir + filename, local_dir + filename)
File "C:\Python27\lib\site-packages\pysftp\__init__.py", line 249, in get
self._sftp.get(remotepath, localpath, callback=callback)
File "C:\Python27\lib\site-packages\paramiko\sftp_client.py", line 806, in get
"size mismatch in get! {} != {}".format(s.st_size, size)
IOError: size mismatch in get! 950272 != 1018742
Run Code Online (Sandbox Code Playgroud)
我查看了 Paramiko 文档,但没有看到什么会触发此错误的解释。此外,代码通常在后续尝试中成功运行,或者在日期范围内的前几个文件中成功运行,然后在下载我需要检索的所有文件的过程中出错。SO 上的其他答案说这可能与驱动器上的可用空间有关,但我尝试清除目标文件夹,但没有帮助。我正在尝试下载到网络驱动器/云存储(如果这有什么区别)。
这是我用来检索文件的函数和代码(通过 …
我想读取安全 SFTP 文件夹上的一些 CSV/Excel 文件,在这些文件中进行一些更改(每个文件中的固定更改,如删除第 2 列),将它们上传到 Postgre 数据库,并将它们上传到不同的 SFTP 路径Python
最好的方法是什么?
我已经使用 pysftp 库连接到 SFTP 并正在读取 Excel:
import pysftp
import pandas as pd
myHostname = "*****"
myUsername = "****"
myPassword = "***8"
cnopts =pysftp.CnOpts()
cnopts.hostkeys = None
sftp=pysftp.Connection(host=myHostname, username=myUsername,
password=myPassword,cnopts=cnopts)
print ("Connection succesfully stablished ... ")
sftp.chdir('test/test')
#sftp.pwd
a=[]
for i in sftp.listdir_attr():
with sftp.open(i.filename) as f:
df=pd.read_csv(f)
Run Code Online (Sandbox Code Playgroud)
我应该如何继续上传到数据库并使对 CSV 的这些更改永久生效?