无法用Python编写“svn export”脚本
我想写一个脚本,让另一个服务器去导出一个SVN仓库。
这是我的Python脚本:
import os
# svn export to crawlers
for s in ['work1.main','work2.main']:
cmd = 'ssh %s "cd /home/zes/ ; svn --force export svn+ssh://174.113.224.177/home/svn/dragon-repos"' % s
print cmd
os.system(cmd)
这个脚本很简单。它会通过SSH连接到work1.main,然后切换到正确的目录。接着调用SVN导出命令。
但是,当我运行这个脚本的时候……
$ python export_to_crawlers.py
ssh work1.main "cd /home/zes/ ; svn --force export svn+ssh://174.113.224.177/home/svn/dragon-repos"
Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,gssapi-with-mic,password).
svn: Connection closed unexpectedly
ssh work2.main "cd /home/zes/ ; svn --force export svn+ssh://174.113.224.177/home/svn/dragon-repos"
Host key verification failed.
svn: Connection closed unexpectedly
为什么会出现这个错误,导致无法导出目录呢?我在命令行手动输入这些命令是可以成功的。为什么脚本就不行呢?
如果我改成这样……就会不工作,什么也不会发生。
cmd = 'ssh %s "cd /home/zes/ ;"' % s
3 个回答
看看这个叫做pxssh的模块,它是pyexpect项目的一部分:
https://pexpect.readthedocs.org/en/latest/api/pxssh.html
这个模块可以让你更简单地自动登录到其他机器上。
我觉得这可能和ssh有关。你是不是在用公钥来自动连接?我觉得你的命令行知道这个公钥,但Python可能不知道。
我不太确定,不过这只是我的一个想法。希望能帮到你。
这是一个关于SSH的问题。
权限被拒绝,请再试一次。
这意味着SSH无法登录。可能是你的SSH代理没有加载正确的密钥,或者你以不同的用户身份运行脚本,或者环境变量没有正确传递。检查一下变量 SSH_AUTH_SOCK
和 SSH_AGENT_PID
是否传递给了你Python脚本的子进程。
主机密钥验证失败。
这个错误意味着SSH不认识远程主机。这表示在文件 $HOME/.ssh/known_hosts
中找不到主机密钥。再次确认你是在脚本的有效用户的主目录下检查。
[编辑] 当你运行脚本时,Python会成为SSH的“输入”:SSH不再连接到控制台,而是会向Python请求登录密码。由于Python不知道SSH想要什么,所以它会忽略这个请求。SSH会尝试三次,然后就失败了。
要解决这个问题,在运行Python脚本之前,先运行以下命令:
eval $(ssh-agent)
ssh-add path-to-your-private-key
把 path-to-your-private-key
替换成你私钥的路径(就是你用来登录的那个)。 ssh-add
会要求你输入密码,然后SSH代理会把它安全地保存起来。它还会修改你的环境变量。这样下次SSH运行时,它会发现有SSH代理在运行,并首先询问它。因为SSH代理知道密码,所以SSH会顺利登录,而不会打扰Python。
要解决第二个问题,手动运行第二个SSH命令一次。这样SSH就会把第二个主机添加到它的文件中,以后就不会再询问了。
[编辑2] 参见 这个指南,了解如何通过SSH使用你的私钥登录远程服务器的详细说明。