我在本地机器上有一个文本文件,它是由在cron中运行的每日Python脚本生成的。
我想添加一些代码,以便通过SSH将该文件安全地发送到我的服务器。
发布于 2008-09-16 00:55:44
您可以使用subprocess.run
调用scp
bash命令(它通过SSH复制文件
import subprocess
subprocess.run(["scp", FILE, "USER@SERVER:PATH"])
#e.g. subprocess.run(["scp", "foo.bar", "joe@srvr.net:/path/to/foo.bar"])
如果您正在创建要在同一个Python程序中发送的文件,那么您需要在用于打开该文件的with
块之外调用subprocess.run
命令(或者,如果您没有使用.close()
块,则首先对该文件调用with
),这样您就可以知道它是从Python刷新到磁盘的。
您需要预先生成(在源计算机上)并安装(在目标计算机上) ssh密钥,以便使用您的公共ssh密钥自动对scp进行身份验证(换句话说,这样您的脚本就不会要求输入密码)。
发布于 2008-09-16 05:27:59
要在Python语言中使用Paramiko库完成此操作(即不通过subprocess.Popen或类似的方法包装scp ),您可以这样做:
import os
import paramiko
ssh = paramiko.SSHClient()
ssh.load_host_keys(os.path.expanduser(os.path.join("~", ".ssh", "known_hosts")))
ssh.connect(server, username=username, password=password)
sftp = ssh.open_sftp()
sftp.put(localpath, remotepath)
sftp.close()
ssh.close()
(您可能希望处理未知主机、错误、创建任何必要的目录等)。
发布于 2008-09-16 00:58:49
您可能会使用subprocess module。如下所示:
import subprocess
p = subprocess.Popen(["scp", myfile, destination])
sts = os.waitpid(p.pid, 0)
其中,destination
的形式可能是user@remotehost:remotepath
。感谢@Charles Duffy指出了我最初答案中的不足之处,我最初的答案使用了一个字符串参数来指定scp操作shell=True
-它不会处理路径中的空格。
模块文档包含examples of error checking that you may want to perform in conjunction with this operation.
确保您设置了正确的凭据,以便可以执行unattended, passwordless scp between the machines。有一个stackoverflow question for this already。
https://stackoverflow.com/questions/68335
复制相似问题