会哭的雨 2019-12-07
既然要通讯,那么必须有服务器和客户端。本文使用sshd做服务器,scp做客户端。
接受文件的一方必须使用sshd启动并绑定本机局域网端口,如0.0.0.0:22
绑定方法就是配置/etc/ssh/sshd_config这个配置文件,如果A(windows/linux/macos)向B(windows/linux/macos)发送文件,那么有两种方式:
假设A的用户名为userA,IP为192.168.1.10,文件路径/1.txt
这里有几点注意:
如何在windows上运行sshd服务器
linux怎么运行sshd就不必说了吧,很容易搜到。这里只讨论windows的,推荐git for windows自带的sshd.exe,scp.exe,ssh.exe,ssh所用账号密码也用windows自身账号密码即可。最好安装everything这个工具,可以搜到传过来的文件保存在哪里,git自带ssh根目录是git安装目录。注意git自带ssh的配置文件在:git根目录/etc/ssh/sshd_config。另外在登录git自带sshd服务时,使用的也是windows自带的账号密码,这样很方便。同时git自带的passwd命令还可以改登录密码
b. GSSAPIAuthentication yes 这一行yes改no并取消注释
import argparse, os from subprocess import call def winToPosix(win): posix = win.replace('\\', '/') return "/" + posix.replace(':', '', 1) parser = argparse.ArgumentParser() parser.add_argument("-i", "--identity_file", help="identity file, default to ~\\.ssh\\idrsa.pub", default=os.environ['USERPROFILE']+"\\.ssh\\id_rsa.pub") parser.add_argument("-d", "--dry", help="run in the dry run mode and display the running commands.", action="store_true") parser.add_argument("remote", metavar="") args = parser.parse_args() local_key = winToPosix(args.identity_file) remote_key = "~/temp_id_rsa.pub" scp_command = "scp {} {}:{}".format(local_key, args.remote, remote_key) print(scp_command) if not args.dry: call(scp_command) ssh_command = ("ssh {} " "mkdir ~/.ssh;" "touch ~/.ssh/authorized_keys;" "cat {} >> ~/.ssh/authorized_keys;" "rm {};").format(args.remote, remote_key, remote_key) print(ssh_command) if not args.dry: call(ssh_command)
然后解决scp传输速度越要越慢的问题。我这里局域网是100Mbps的,然而scp传输文件时,最开始能达到3M,最后慢慢降到1M以下,所以单纯用scp也不行的。在使用scp的时候,使用-o "Compression yes"能使速度稳在4M,即:scp -o "Compression yes" 1.txt :/1.txt