本文是基於 【267】實現跨網絡傳數據 的基礎上的,由於在彈出 putty 之后,需要手動輸入命令(pass.sh、get.sh)來實現數據的傳遞,另外就是處理完之后需要手動關閉 putty,本文解決的兩個問題就是在 putty 上自動輸入命令以及推出(exit)。
解決方法:
1. 系統在調用 putty 之后,利用 【321】python進程監控:psutil 中的知識點,可以判斷 putty 是否運行,如果運行了,則可以通過 【322】python控制鍵盤鼠標:pynput 中的知識點自動輸入【pass.sh 或 get.sh】,從而實現putty的命令自動輸入(根據經驗判斷鼠標的位置落在 putty 界面上,因此需要 putty 始終保持最上面顯示);
2. putty 命令執行完之后,需要執行【exit】命令關閉窗體,問題在於什么時候 putty 執行完畢,是通過 【326】Python 截圖及圖片識別 中截取 putty 所在界面,然后通過圖片識別技術判斷里面是否含有某些文字,如果有的話,可以知道 putty 已經處理完畢。如上,此處也要保證 putty 最上顯示,另外截圖的區域是按照經驗設置的。截圖如下所示:

代碼實現:
文件夾設置如下:
- 📁Data
- 📁Scripts
- 📃Get_Data.py
- 📃Pass_Data.py
- 📃pscp.exe
- 📃putty.exe
- 📃Get_Data.bat
- 📃Pass_Data.bat
具體代碼如下:
Get_Data.py
# coding=utf-8
from PIL import ImageGrab
from PIL import Image
import pynput, time, os, psutil, pytesseract
from pynput.mouse import Button
from pynput.keyboard import Key
mouse = pynput.mouse.Controller()
keyboard = pynput.keyboard.Controller()
def autoinput():
mouse.position=(499, 273)
mouse.click(Button.left)
keyboard.press(Key.shift)
keyboard.release(Key.shift)
keyboard.press('g')
keyboard.press('e')
keyboard.press('t')
keyboard.press('.')
keyboard.press('s')
keyboard.press('h')
keyboard.press(Key.enter)
keyboard.release(Key.enter)
keyboard.press(Key.shift)
keyboard.release(Key.shift)
def autoinput_exit():
mouse.position=(499, 273)
mouse.click(Button.left)
# 用來切換輸入法,我電腦默認中文
keyboard.press(Key.shift)
keyboard.release(Key.shift)
keyboard.press('e')
keyboard.press('x')
keyboard.press('i')
keyboard.press('t')
keyboard.press(Key.enter)
keyboard.release(Key.enter)
# 再把輸入法切換回來
keyboard.press(Key.shift)
keyboard.release(Key.shift)
def savePic():
pic = ImageGrab.grab(bbox=(175, 299, 719, 701))
pic.save(r"D:\Windows-Linux\Scripts\tmp.jpg")
def getChinese():
str_chi = ["數", "據" ,"復" ,"制" ,"完","成", "退" ,"出"]
text=pytesseract.image_to_string(Image.open(r'D:\Windows-Linux\Scripts\tmp.jpg'),lang='chi_sim')
for s in str_chi:
if(text.find(s) > -1):
return True
return False
flag = 0
for i in range(0, 100):
# 獲取進程id
ps = psutil.pids()
# 判斷是否有putty進程,默認只有一個putty
for pi in ps:
p = psutil.Process(pi)
if p.name().find("putty") == 0:
autoinput()
flag = 1
break
if(flag):
break
time.sleep(1)
time.sleep(5)
for i in range(0, 100):
savePic()
if(getChinese()):
autoinput_exit()
break
time.sleep(1)
Pass_Data.py
# coding=utf-8
# 圖片識別技術
from PIL import ImageGrab
from PIL import Image
import pynput, time, os, psutil, pytesseract
from pynput.mouse import Button
from pynput.keyboard import Key
mouse = pynput.mouse.Controller()
keyboard = pynput.keyboard.Controller()
def autoinput():
mouse.position=(499, 273)
mouse.click(Button.left)
# 用來切換輸入法,我電腦默認中文
keyboard.press(Key.shift)
keyboard.release(Key.shift)
keyboard.press('p')
keyboard.press('a')
keyboard.press('s')
# 一樣的按鍵不用release會顯示一個按鍵
keyboard.release('s')
keyboard.press('s')
keyboard.press('.')
keyboard.press('s')
keyboard.press('h')
keyboard.press(Key.enter)
keyboard.release(Key.enter)
# 再把輸入法切換回來
keyboard.press(Key.shift)
keyboard.release(Key.shift)
def autoinput_exit():
mouse.position=(499, 273)
mouse.click(Button.left)
# 用來切換輸入法,我電腦默認中文
keyboard.press(Key.shift)
keyboard.release(Key.shift)
keyboard.press('e')
keyboard.press('x')
keyboard.press('i')
keyboard.press('t')
keyboard.press(Key.enter)
keyboard.release(Key.enter)
# 再把輸入法切換回來
keyboard.press(Key.shift)
keyboard.release(Key.shift)
def savePic():
pic = ImageGrab.grab(bbox=(175, 299, 719, 701))
pic.save(r"D:\Windows-Linux\Scripts\tmp.jpg")
def getChinese():
str_chi = ["數", "據" ,"復" ,"制" ,"完","成", "退" ,"出"]
text=pytesseract.image_to_string(Image.open(r'D:\Windows-Linux\Scripts\tmp.jpg'),lang='chi_sim')
for s in str_chi:
if(text.find(s) > -1):
return True
return False
flag = 0
for i in range(0, 100):
# 獲取進程id
ps = psutil.pids()
# 判斷是否有putty進程,默認只有一個putty
for pi in ps:
p = psutil.Process(pi)
if p.name().find("putty") == 0:
autoinput()
flag = 1
break
if(flag):
break
time.sleep(1)
time.sleep(5)
for i in range(0, 100):
savePic()
if(getChinese()):
autoinput_exit()
break
time.sleep(1)
Get_Data.bat
@echo off echo. echo 連接Linux電腦,主機:192.168.14.28,用戶名:ocean,密碼:lj666yjh echo. echo 執行代碼【get.sh】 cd ./Scripts start /min cmd /c python D:\Windows-Linux\Scripts\Get_Data.py putty.exe -pw lj666yjh ocean@192.168.14.28 echo. pscp.exe -pw lj666yjh ocean@192.168.14.28:/home/ocean/alex/Others/Linux-Windows/Data/* D:\Windows-Linux\Data\ echo. echo 數據傳輸成功! echo. start D:\Windows-Linux\Data
Pass_Data.bat
@echo off cd ./Scripts pscp.exe -pw lj666yjh D:\Windows-Linux\Data\* ocean@192.168.14.28:/home/ocean/alex/Others/Linux-Windows/Data echo. echo 連接Linux電腦,主機:192.168.14.28,用戶名:ocean,密碼:lj666yjh echo. echo 執行代碼【pass.sh】 start /min cmd /c python Pass_Data.py putty.exe -pw lj666yjh ocean@192.168.14.28 echo. echo 數據傳輸成功! echo.
源碼下載:Windows-Linux.zip
