有的时候,我们通过某些远程工具,可以是远程主机与本机共享剪切板,但是这种剪切板只能传输文本,不能传输文件。
那么有没有依靠于文本的方式,进行文件传输呢?
因为文本模式往往有长度限制,所以思路是这样的:
1.将待传输文件切片,每一片整理为base64,存储到剪切板
2.目标机器读取剪切板数据,解析成二进制,写入文件
3.重复上述过程,将一个文件全部数据发送过去
我自己写了个,试了试,能用,在vm中,你要不断地把鼠标划入虚拟机,再划出来,以此同步双方剪切板。
聊胜于无吧,用于极端情况下的文件传输。
[Python] 纯文本查看 复制代码 import pyperclip,time,json
from base64 import b64encode, b64decode
import argparse
parser = argparse.ArgumentParser(description='使用剪切板文本模式发送文件,发送端先启动,接收端再启动')
parser.add_argument("-s","--send",help="选择发送模式",action="store_true")
parser.add_argument("-g","--get",help="选择接收模式",action="store_true")
parser.add_argument("-f","--file",help="指定发送或接收的文件路径及名称",type=str)
parser.add_argument("--size",help="指定单次发送内容的字节数,默认为1024",type=int,default=1024)
args=parser.parse_args()
read_file=args.file
write_file=args.file
#True-发送 False-接受
mode=args.send
size=args.size
now_data=""
now_id=0
now_id_list=[]
error_num=0
def check_data(now_id):
"""
"""
global now_data
while True:
text = pyperclip.paste()
if now_data==text:
time.sleep(0.01)
continue
try:
data=json.loads(text)
if data["now_id"]==now_id and data["answer"]==True:
now_data=text
return True
except Exception:
return False
def send(read_file):
"""
发送数据
"""
global size,now_data,now_id
f=open(read_file,mode="rb")
finish=False
while finish==False:
time.sleep(0.01)
file_data=f.read(size)
now={
"now_id":now_id,
"finish":False,
"answer":False,
"data":b64encode(file_data).decode("utf8")
}
if len(file_data)==0:
print("send data finish!")
now["finish"]=True
finish=True
while True:
data=json.dumps(now)
now_data=data
pyperclip.copy(now_data)
if check_data(now_id):
now_id=now_id+1
break
else:
time.sleep(0.01)
if len(file_data)==0:
exit()
def get_data(write_file):
"""
发送数据
"""
global now_data,now_id
f=open(write_file,mode="wb")
finish=False
while finish==False:
text = pyperclip.paste()
if now_data==text:
time.sleep(0.01)
else:
now_data=text
try:
data=json.loads(text)
now_id=data["now_id"]
finish=data["finish"]
file_data=b64decode(data["data"])
if now_id not in now_id_list:
now_id_list.append(now_id)
f.write(file_data)
now_data=json.dumps({
"now_id":now_id,
"finish":finish,
"answer":True
})
error_num=0
pyperclip.copy(now_data)
except Exception:
now_data=""
pyperclip.copy(now_data)
error_num=error_num+1
time.sleep(0.01)
if error_num>100000:
exit()
f.close()
if mode:
send(read_file=read_file)
else:
get_data(write_file=write_file)
使用方式:
[Bash shell] 纯文本查看 复制代码 >python send_file.py -h
usage: send_file.py [-h] [-s] [-g] [-f FILE] [--size SIZE]
使用剪切板文本模式发送文件,发送端先启动,接收端再启动
options:
-h, --help show this help message and exit
-s, --send 选择发送模式
-g, --get 选择接收模式
-f FILE, --file FILE 指定发送或接收的文件路径及名称
--size SIZE 指定单次发送内容的字节数,默认为1024
别忘了来回滑动鼠标,同步双方剪切板
笑死,我写的这都是啥工具
|