如何使用SSH密钥编写Python Paramiko SFTP代码

5

我已经编写了一个Python的主方法,其中包含许多操作来创建文件。 现在我想要使用SFTP将该文件从本地服务器发送到远程服务器。 请问有没有人可以帮助我添加一个Python方法,该方法将首先执行主方法,然后执行paramiko方法以进行SFTP。 请为我提供一个简单的代码示例。我非常困惑!


不,我需要使用公钥和私钥连接并进行SFTP。公钥已经安装在远程服务器上,只需将文件放到远程服务器上即可。 - Helen
您实际上有两个不同的问题。1)使用公钥身份验证连接到SFTP服务器。2)将文件上传到SFTP服务器。第2)个问题已经在上面的问题中得到了回答(以及这里的两个答案)。如果您想询问1),请就此提出具体问题。不要通过上传部分使问题变得复杂。那只会让您得到错误的答案。 - Martin Prikryl
2个回答

1
import paramiko


def upload_file(remote_server, ssh_user, ssh_password, local_filepath, remote_path, port_number=22):
    sftp = None
    transport = None

    try:
        # Create transport instance and setup SFTP connection
        transport = paramiko.Transport((remote_server, port_number))
        transport.connect(None, ssh_user, ssh_password)
        sftp = paramiko.SFTPClient.from_transport(transport)

        # Upload file to remote destination
        sftp.put(local_filepath, remote_path)
    except Exception as e:
        print(f'Failed to transfer files: {e}')
        if sftp:
            sftp.close()
        if transport:
            transport.close()

样例调用

upload_file("10.197.15.1", "ssh_user", "ssh_password", "/tmp/myfile.txt", "/home/user/sftp/myfile.txt")

0
以下是将内容写入文件并将其通过SFTP传输到远程服务器的示例:
import paramiko
import os
paramiko.util.log_to_file("paramiko.log")

# Open a transport
def sftp_transport():
    host,port = "example.com",22
    transport = paramiko.Transport((host,port))

    # Auth
    username,password = "foo","foo"
    transport.connect(None,username,password)

    # Go!
    sftp = paramiko.SFTPClient.from_transport(transport)

    # Upload
    filepath = "/home/foo.jpg"
    localpath = os.path.join('C:\\', 'Users', 'example', 'desktop','example.txt')
    sftp.put(localpath,filepath)

    # Close
    if sftp: sftp.close()
    if transport: transport.close()

def write_file():
    localpath = os.path.join('C:\\', 'Users', 'example', 'desktop','example.txt')
    f = open(localpath, 'w')
    f.write("Now the file has some content!")
    f.close()

write_file()
sftp_transport()

请问您能帮我如何使用私钥公钥进行操作吗?公钥已添加到远程服务器。我想使用远程服务器进行SFTP操作。 - Helen
2
@Helen,然后可以使用ssh客户端进行sftp操作,您可以按照以下方式传递密钥文件:k = paramiko.RSAKey.from_private_key_file(keyfile) ssh = paramiko.SSHClient() ssh.connect( hostname = "www.acme.com", username = "ubuntu", pkey = k ) sftp = ssh.open_sftp() - Dhiraj Bansal
当我运行代码时,出现“没有这样的文件或目录”错误。这是私钥文件路径中的错误。我已将私钥保存在.ppk中。有必要以任何特定格式存储密钥吗? - Helen
请检查路径或文件名是否正确。我正在使用相同的东西,没有遇到“无此文件或目录”的问题。我还保存了Putty Keygen,并且始终将私钥保存在 .ppk 文件中。 - Dhiraj Bansal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接