最近搞 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 能完整传文件?
1
zjsxwc OP Python 大神去哪里了,我记得坛子里很多人生苦短我用 Python 者来着的
|
2
smartbot 2018-09-30 00:27:51 +08:00 1
尝试一下 Fabric,项目中使用体验非常好
|
3
zjsxwc OP 目前猜测,不应该用 EOF 作为 expect,应该用 100 代表的百分百完成作为 expect。
Python 的 fabric 真好,相见恨晚 |
4
lolizeppelin 2018-09-30 13:49:54 +08:00 via Android
处理好 stdin scp 只要 wait 就行了
|
5
hansight2018 2018-09-30 18:34:16 +08:00 via Android
第二次 ret 是多少,试试把 timeout 设长点。
|
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 连接 #收工下班 |
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 |