Python 的 pexpect 使用 scp 把文本文件传一半就不传了,怎么办?

2018-09-29 21:14:34 +08:00
 zjsxwc

最近搞 jenkins,发现用 python 的 pexpect 蛮方便的,但是发现问题用 scp 传文件只传了一半,代码如下:

def scp(user,host,password):
    child = pexpect.spawn("scp  " + "/root/.jenkins/workspace/item1111/fuck.css  "+user+"@"+host+":"+codePath+"/fuck.css.new")
    ret = child.expect([pexpect.TIMEOUT, user])
    if ret == 1:
        child.sendline(password)
        ret = child.expect([pexpect.TIMEOUT, pexpect.EOF])
    child.close()

然后排查了半天发现fuck.css只传了半个就结束了,坑啊,没办法暂时只能换种方式传文件(用 curl 了汗),

但是为了要让 scp 能完整传文件我下班后 gooooooooogle 试了半天还是没办法,于是到论坛来问了:

有什么办法让 scp 能完整传文件?

2008 次点击
所在节点    Python
7 条回复
zjsxwc
2018-09-29 21:39:21 +08:00
Python 大神去哪里了,我记得坛子里很多人生苦短我用 Python 者来着的
smartbot
2018-09-30 00:27:51 +08:00
尝试一下 Fabric,项目中使用体验非常好
zjsxwc
2018-09-30 03:08:19 +08:00
目前猜测,不应该用 EOF 作为 expect,应该用 100 代表的百分百完成作为 expect。

Python 的 fabric 真好,相见恨晚
lolizeppelin
2018-09-30 13:49:54 +08:00
处理好 stdin scp 只要 wait 就行了
hansight2018
2018-09-30 18:34:16 +08:00
第二次 ret 是多少,试试把 timeout 设长点。
ps1aniuge
2018-10-09 15:10:51 +08:00
linux 版 powershell,管理员权限运行 Install-Module winscp 即可。

[测试通过的脚本例子]
#----------------------------
#用户输入部分
$本地文件_路径 = 'd:\'
$本地文件_文件名 = 'a1.txt'
$本地文件_绝对路径名 = join-path -Path $本地文件_路径 -ChildPath $本地文件_文件名

$远程路径 = '/UPLOAD/'
$ftp 服务器 = '192.168.1.1'
$用户名 = 'a'
$用户密码明文 = '测试通过-2017-11'
#----------------------------
#脚本 main
$用户密码密文 = ConvertTo-SecureString $用户密码明文 -AsPlainText -Force
$我的登陆凭据 = New-Object System.Management.Automation.PSCredential ($用户名,$用户密码密文)
$ftp 连接参数 = new-WinSCPSessionOption -Protocol Ftp -HostName $ftp 服务器 -Credential $我的登陆凭据
$ftp 连接 = new-WinSCPSession -SessionOption $ftp 连接参数

$传输参数_二进制 = New-WinSCPTransferOption -TransferMode Binary
Send-WinSCPItem -WinSCPSession $ftp 连接 -LocalPath $本地文件_绝对路径名 -RemotePath "$远程路径" -TransferOptions $传输参数_二进制
#上传用 Send-WinSCPItem

Receive-WinSCPItem -WinSCPSession $ftp 连接 -RemotePath "$远程路径 /a2.txt" -LocalPath "d:\j"
#下载用 Receive-WinSCPItem



Remove-WinSCPSession -WinSCPSession $ftp 连接 #收工下班
ps1aniuge
2018-10-09 15:11:56 +08:00
推荐理由:

1 支持 ftp,sftp,webdav。

2 无需先下载整个文件,winscp 模块支持,从 ftp 服务器上,获取文件的校验码,从而得知是否文件是变化的。
有 Get-WinSCPItemChecksum 从而可以同步文件。
网页 https://winscp.net/eng/docs/protocols 的,Checksum calculation 章节,详细说明了这个内容。

3 支持命令行显示 ftp 完成进度,文件权限,文件掩码,传输限速,是否覆盖。文件传输模式( ascii or 二进制)详见此命令:
New-WinSCPTransferOption

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/493969

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX