1. 程式人生 > >用python實現遠端複製 (scp + expect )

用python實現遠端複製 (scp + expect )

scp 功能很強大,但需要人工輸入 password, 當然可以通過把 公鑰儲存在遠端主機的 ~/.ssh 目錄中,而後就不用輸入password,但這需要配置.

用 sshpass 可能在命令輸入 password, 但 需要用 “sudo apt-get install sshpass” 安裝

如果不想用上面兩種方法,可以用 expect 編寫指令碼可以幫助我們自動互動

雖然 python 也提供 pexpect  模組,但既然 expect 很簡單,為何不直接用 os.system() 去執行呢?

下面是我編寫的類,實現了遠端複製 

class RemoteShell:

    def __init__(self, host, user, pwd):
        self.host = host
        self.user  = user
        self.pwd  = pwd


    def put(self, local_path, remote_path):
scp_put = '''
spawn scp %s %
[email protected]
%s:%s expect "(yes/no)?" { send "yes\r" expect "password:" send "%s\r" } "password:" {send "%s\r"} expect eof exit''' os.system("echo '%s' > scp_put.cmd" % (scp_put % (os.path.expanduser(local_path), self.user, self.host, remote_path, self.pwd, self.pwd))) os.system('expect scp_put.cmd') os.system('rm scp_put.cmd')

但發現每次檔案都沒有複製完,我想看expect 究竟做了什麼事情,還好 expect 提供 -d 引數給出更多的資訊。

最後發現是被複制檔案太大,expect 超時退出了

在指令碼前加入 “set timeout -1" 就OK了

scp_put = '''
set timeout -1
spawn scp %s %[email protected]%s:%s
expect "(yes/no)?" {
send "yes\r"
expect "password:"
send "%s\r"
} "password:" {send "%s\r"}
expect eof
exit'''

總結

1) expect 每一條語句都是順序執行

 因為scp 可能先返回 (yes/no)? 再 返回 password:, 也可能直接返回password:, 考慮順序關係,上面語句的層次關係其實如下:
expect "(yes/no)?" {   send "yes\r"
                       expect "password:"
                       send "%s\r"
                    } 
       "password:" {send "%s\r"}

2) 每當 spawn 的程式有輸出的時候的,expect都會去匹配, 如果匹配不上,就等下次有輸出,再次執行當前的 expect, 直到超時 (我用 expect -d 去追蹤,得到的結論);當然可以設定沒有超時 "set timeout -1"

3) 如果  expect 退出, 被它 spawn 的程式會被 kill 掉

4) spawn 結束的時候,它向標準輸出的的 eof 會被 expect 檢測到,正好作為 expect 指令碼退出的時機。

對於 scp 可以先檢測 100%,因為 scp 會輸出複製進度,再檢測 eof

expect "100%%"
expect eof

5) expect 是部分匹配,所以不要擔心自己不知道程式的完整輸出

相關推薦

python實現遠端複製 scp + expect

scp 功能很強大,但需要人工輸入 password, 當然可以通過把 公鑰儲存在遠端主機的 ~/.ssh 目錄中,而後就不用輸入password,但這需要配置. 用 sshpass 可能在命令輸入 password, 但 需要用 “sudo apt-get install

Python實現代理池Proxy Pool系統

跨語言高效能IP代理池,Python實現。 注意:請執行程式前先更新一下抓取代理的函式。 執行環境 Python 3.5 (請務必保證Python的版本在3.5以上,否則非同步

物理機與遠端伺服器或者虛擬機器實現檔案複製SCP

1.使用SCP命令實現 參考:https://blog.csdn.net/yhblog/article/details/83927141 2.使用filezilla工具實現檔案複製 注:使用filezilla傳輸前需要填寫遠端伺服器ip,使用者名稱,密碼(填寫使用者名稱最好填寫要用

練習 5-3 指標實現函式strcats,t將t指向的字串複製到s指向的字串的尾部。

1. 首先想到就是的將字串s迴圈到‘\0’的前一個字元,然後將字串t的地址給此時的s地址。  兩個問題: ①這種s=t,是不對的,只是拷貝了指標,並沒有進行字串的複製? ②當執行語句 while(*s++);時,此時 *s='\0', 所以後面應該s--;或者這樣寫 wh

Python玩微信非常詳細

tree dir colors 位置 echarts 拼接 spl 表示 開源項目 代碼放在這裏:wzyonggege/python-wechat-itchat 詞雲那裏可以換成小黃人圖片 -----------------------------------------

python實現迴旋矩陣旋轉矩陣

我們知道Python中是沒有陣列 這種資料結構的,所以要想實現迴旋矩陣,需要先匯入一個numpy包, 它是一個由多維陣列物件和用於處理陣列的例程集合組成的python擴充程式庫,可以用來做陣列算數和邏輯運算 思路: 首先建立一個n*m全為零的矩陣,然後按照旋轉規律依次替換

Redis實現主從複製Master&Slave

         由於前段時間公司專案比較趕,一直抽不出時間寫部落格,今天偷空寫一篇吧。前面給大家講解了單機版redis的基本操作,現在繼續給大家講解一下Redis的進階部分,主從複製和讀寫分離。 一、Master&Slave是什麼?          也就是我們所

沒有基礎小編帶你,python畫機器貓有程式碼

小編帶你玩python 沒有基礎小編帶你,用python畫機器貓。只需要python3和小編的程式碼即可。python3小編送,程式碼文章有,現在就差個你了。 執行不了的找小編,小編包教會你。 重要的事情說三遍: python3小編送,程式碼文章有。 python3小編送,程式碼文章有。 python

機器學習經典演算法詳解及Python實現--線性迴歸Linear Regression演算法

(一)認識迴歸 迴歸是統計學中最有力的工具之一。機器學習監督學習演算法分為分類演算法和迴歸演算法兩種,其實就是根據類別標籤分佈型別為離散型、連續性而定義的。顧名思義,分類演算法用於離散型分佈預測,如前

Python實現遺傳演算法二進位制編碼求函式最優值

目標函式 maxf(x1,x2)=21.5+x1sin(4πx1)+x2sin(20πx2) max f({x_1},{x_2}) = 21.5 + {x_1}\sin (4\pi {x_1}) + {x_2}\sin (20\pi {x_2})

機器學習經典演算法詳解及Python實現--決策樹Decision Tree

(一)認識決策樹 1,決策樹分類原理 決策樹是通過一系列規則對資料進行分類的過程。它提供一種在什麼條件下會得到什麼值的類似規則的方法。決策樹分為分類樹和迴歸樹兩種,分類樹對離散變數做決策樹,迴歸樹對連續變數做決策樹。 近來的調查表明決策樹也是最經常使用的資料探勘演算法,它

Python實現簡易通訊錄修改版

描述: 上一篇部落格我寫了一個簡單的通訊錄,但是還是覺得不夠完美: 需要輸入ID,雖然ID是主鍵,但是沒有實現自增功能; 忘記加電話號碼了; 如果插入使用者名稱相同,則後續的查、改、刪功能受到影響; 所以,我這個修改版主要修正了以上三點缺陷。具體如下

教你TensorFlow實現神經網路附程式碼

來源:雲棲社群 作者:Pavel Surmenok 本文長度為2600字,建議閱讀5分鐘 本文幫助你理解神經網路的應用,並使用TensorFlow解決現實生活中的問題。 如果你一直關注資料科學

Redis4.0.2實現遠端連線centos7.2

最近開始學習redis,在伺服器上安裝了redis之後,遠端連線一直連線不上,報錯如下: redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused: connec

Mysql 5.7.1.0 實現主從複製master-slave

開始前 請 保證兩臺主機的 防火牆、防毒軟體 不會阻止兩臺主機的正常通訊 。下面通過6步操作實現主從複製!

[開發技巧]·Python實現訊號濾波基於scipy

[開發技巧]·Python實現訊號濾波(基於scipy)   個人網站--> http://www.yansongsong.cn GitHub主頁--> https://github.com/xiaosongshine ​ 1.背景

指派問題——匈牙利Hungary演算法python實現

注:昨天剛剛看了關於python的關於陣列的簡單操作,就將匈牙利演算法用python實現了以下。其中可能有很多點可以用python中陣列本身屬性實現,但由於初學,所以不熟悉而導致步驟繁瑣的望指出~ 1.匈牙利演算法的簡單例子 (1)矩陣所表示的就是從A點到B

python實現遠端scp檔案

import sys import os,re import pipes import subprocess from subprocess import * from config import * //引數可配置化 import random from mu

Python3學習筆記Python實現深度優先

這裡主要是用Python實現下深度優先的概念,由於程式碼寫得比較隨意,就沒有封裝成類,而是寫成一個函式 用一個列表做為實驗資料,模擬成二叉樹結構,用遞迴的方式不斷獲取二叉樹上的左節點,一直到左節點 序號超出列表範圍,然後迴歸獲取右節點,以此來實現深度優先。 以下是程式碼

厲害了,Python實現自動掃雷!附帶原始碼

  自動掃雷一般分為兩種,一種是讀取記憶體資料,而另一種是通過分析圖片獲得資料,並通過模擬滑鼠操作,這裡我用的是第二種方式。 學習Python中有不明白推薦加入交流群