我正在使用pysftp编写程序,它想要验证SSH主机密钥C:\Users\JohnCalvin\.ssh\known_hosts
.
使用PuTTY,终端程序将其保存到注册表[HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys]
.
如何调和pysftp和PuTTY之间的区别?
我的代码是:
import pysftp as sftp
def push_file_to_server():
s = sftp.Connection(host='138.99.99.129', username='root', password='*********')
local_path = "testme.txt"
remote_path = "/home/testme.txt"
s.put(local_path, remote_path)
s.close()
push_file_to_server()
Run Code Online (Sandbox Code Playgroud)
我收到的错误响应是:
E:\ Program Files(x86)\ Anaconda3\lib\site-packages\pysftp__init __.py:61:UserWarning:
无法从C:\ Users\JohnCalvin.ssh\known_hosts加载HostKeys.
您需要显式加载HostKeys(cnopts.hostkeys.load(filename))或disableHostKey检查(cnopts.hostkeys = None).warnings.warn(wmsg,UserWarning)Traceback(最近一次调用最后一次):文件"E:\ OneDrive\Python\GIT\DigitalCloud\pysftp_tutorial.py",第14行,在push_file_to_server()文件"E:\ OneDrive\Python\GIT\DigitalCloud\pysftp_tutorial.py",第7行,在push_file_to_server中s = sftp.Connection(host ='138.99.99.129',用户名='root',密码='********')文件"E :\ Program Files(x86)\ Anaconda3\lib\site-packages\pysftp__init __.py",第132行,在 init self._tconnect ['hostkey'] = self._cnopts.get_hostkey(host)文件"E:\ Program Files (x86)\ Anaconda3\lib\site-packages\pysftp__init __.py",第71行,在get_hostkey中引发SSHException("找不到主机%s的主机密钥."%host)paramiko.ssh_exception.SSHException:主机138.99没有主机密钥. 99.129找到了.在以下情况中忽略异常:> Traceback(最近一次调用最后一次):文件"E:\ Program Files(x86)\ Anaconda3\lib\site-packages\pysftp__init __.py",第1013行,在 del self.close()文件中"E :\ Program Files(x86)\ Anaconda3\lib\site-packages\pysftp__init __.py",第784行,如果self._sftp_live关闭:AttributeError:'Connection'对象没有属性'_sftp_live'
我想很好地捕获“找不到主机 *** 的主机密钥”时的错误,并向最终用户提供适当的消息。我试过这个:
import pysftp, paramiko
try:
with pysftp.Connection('1.2.3.4', username='root', password='') as sftp:
sftp.listdir()
except paramiko.ssh_exception.SSHException as e:
print('SSH error, you need to add the public key of your remote in your local known_hosts file first.', e)
Run Code Online (Sandbox Code Playgroud)
但不幸的是输出不是很好:
SSH error, you need to add the public key of your remote in your local known_hosts file first. No hostkey for host 1.2.3.4 found.
Exception ignored in: <function Connection.__del__ at 0x00000000036B6D38>
Traceback (most recent call last):
File "C:\Python37\lib\site-packages\pysftp\__init__.py", line 1013, …
Run Code Online (Sandbox Code Playgroud) 我写了一个简单的代码,用于将文件上传到python中的sftp服务器.我正在使用python 2.7
import pysftp
srv = pysftp.Connection(host="www.destination.com", username="root",
password="password",log="./temp/pysftp.log")
srv.cd('public') #chdir to public
srv.put('C:\Users\XXX\Dropbox\test.txt') #upload file to nodejs/
# Closes the connection
srv.close()
Run Code Online (Sandbox Code Playgroud)
该文件未出现在服务器上.但是,没有出现错误消息.代码有什么问题?
编辑:我已启用日志记录.我发现文件上传到根文件夹而不是公共文件夹下.似乎srv.cd('public')
没有用.
我们可以写一个get
这样的简单:
import pysftp
hostname = "somehost"
user = "bob"
password = "123456"
filename = 'somefile.txt'
with pysftp.Connection(hostname, username=user, private_key='/home/private_key_file') as sftp:
sftp.get(filename)
Run Code Online (Sandbox Code Playgroud)
但是,我想在文件名中指定一个模式,例如: '*.txt'
关于如何使用这个的任何想法pysftp
?
所以我在通过 SFTP 连接到远程服务器时遇到了很多问题。我已经尝试过像下面这样的正常方法。
sftp = pysftp.Connection(host='Host',username='username',password='passwd',private_key=".ppk")
Run Code Online (Sandbox Code Playgroud)
哪个不起作用。我收到以下错误:
SSHException: 找不到主机 ***** 的主机密钥。
然后我尝试了以下方法:
cnopts = pysftp.CnOpts()
cnopts.hostkeys = None
s = pysftp.Connection(host='host', username='user', password='password', cnopts=cnopts)
Run Code Online (Sandbox Code Playgroud)
这也不起作用。我收到以下错误:
BadAuthenticationType: ('Bad authentication type', ['publickey']) (allowed_types=['publickey'])
同样,当我运行以下命令时:
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect("host",username = "username",password = "password")
ssh_session = client.get_transport().open_session()
Run Code Online (Sandbox Code Playgroud)
我犯了同样的错误:
BadAuthenticationType: ('Bad authentication type', ['publickey']) (allowed_types=['publickey'])
我试图将我的本地Windows目录中的几个文件复制到远程linux目录.
它适用于具有相同类型扩展名的文件.但是当文件夹中有不同的扩展名时会中断.
代码:
import os
import glob
import paramiko
glob_pattern='*.*'
try:
ssh.connect(host,username=user,password=pwd)
ftp = ssh.open_sftp()
try:
ftp.mkdir(dir_remote)
command=dir_remote+'/setuplog'
ftp.mkdir(command)
commande=dir_remote+'/emsfolder'
ftp.mkdir(commande)
try:
for fname in glob.glob(uploadfolder + os.sep + glob_pattern):
local_file = os.path.join(uploadfolder, fname)
remote_file = dir_remote + '/' + os.path.basename(local_file)
ftp.put(local_file,remote_file)
ftp.chmod(remote_file ,0777)
except IOError, e:
print (e)
except IOError, e:
print (e)
except paramiko.AuthenticationException, ae:
print (ae)
finally:
ssh.close()
Run Code Online (Sandbox Code Playgroud)
我试图只传输2个文件(1.sh和2.pl).当1.sh被复制时,在远程服务器上创建了一个0字节的2.pl文件然后我得到了错误:
size mismatch in put! 0 != 2200
Run Code Online (Sandbox Code Playgroud)
我在用:
python 2.7, Paramiko - 1.15.2
Run Code Online (Sandbox Code Playgroud)
请帮助.
我正在尝试加载(并直接保存在本地).csv
存储在FTP服务器(SFTP协议)上的文件.我正在将Python与pysftp库结合使用.当我检查文件是否存在时,它返回TRUE.但是在尝试加载文件时,无论我尝试什么,它似乎都是空的.
如何将文件存入(并存储)到我的本地环境?我想念一些明显的东西吗?
import pysftp
cnopts = pysftp.CnOpts()
cnopts.hostkeys = None
# Make connection to sFTP
with pysftp.Connection(hostname,
username=sftp_username,
password=sftp_pw,
cnopts = cnopts
) as sftp:
sftp.isfile('directory/file.csv')) ## TRUE
file = sftp.get('directory/file.csv')
print(file) ## None
sftp.close()
Run Code Online (Sandbox Code Playgroud) 我有一个简单的要求在SFTP服务器上删除文件.我发现pysftp和Paramiko库似乎允许我这样做并使用Paramiko开发了一个简单的应用程序,但我找不到比较两者的正确来源,所以我可以决定哪个我可以/应该使用.每种方法的优缺点是什么?
我有一个存储在变量中的大型 xml 文件。我想使用 pysftp 将它直接写入 ftp。我相信我需要使用 pysftp.putfo 并且这需要一个类似对象的文件。这是一个最小的例子:
from io import StringIO
from pysftp import Connection, CnOpts
cnopts = CnOpts()
cnopts.hostkeys = None
with Connection('localhost'
,username= 'admin'
,password = 'test'
,cnopts=cnopts
) as sftp:
sftp.putfo(StringIO('xml string'))
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
TypeError: Expected unicode or bytes, got None
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?是否有更简单更好的方法来实现我将字符串变量写入 ftp 上的文件的目标?
我正在编写一个简单的脚本来连接我的 sftp 服务器,aws-lambda
我得到了
Unable to import module 'lambda_function': No module named '_cffi_backend'
Run Code Online (Sandbox Code Playgroud)
当我pysftp
从导入时aws-lambda
。我正在使用python3.6
并且仅导入pysftp
其他内容
我已经尝试安装 cffi
python3 pip install cffi
Run Code Online (Sandbox Code Playgroud) pysftp ×10
python ×9
sftp ×6
paramiko ×3
python-2.7 ×2
ssh ×2
aws-lambda ×1
exception ×1
fabric ×1
python-3.x ×1
stringio ×1