V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
zjsxwc
V2EX  ›  Python

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

  •  
  •   zjsxwc ·
    zjsxwc · 2018-09-29 21:14:34 +08:00 · 2159 次点击
    这是一个创建于 2236 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近搞 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 能完整传文件?

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

    Python 的 fabric 真好,相见恨晚
    lolizeppelin
        4
    lolizeppelin  
       2018-09-30 13:49:54 +08:00 via Android
    处理好 stdin scp 只要 wait 就行了
    hansight2018
        5
    hansight2018  
       2018-09-30 18:34:16 +08:00 via Android
    第二次 ret 是多少,试试把 timeout 设长点。
    ps1aniuge
        6
    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
        7
    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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6013 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 02:22 · PVG 10:22 · LAX 18:22 · JFK 21:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.