我想安全地将文件从一台计算机复制到另一台计算机,但另一台计算机不受信任,而且除了向计算机所有者提供说明外,我无法直接访问它。此外,这只是一次性的情况,因此应避免任何繁琐的设置。最简单、最便携的方法是什么?
我所设想的程序应该具有以下工作流程:
拥有文件的主机发出一个假设的命令来使文件可用,并使用密码保护:
file-offer -p PASSWORD file1 file2 file3 directory
另一个是使用带有密码的假设命令来接收文件(使用 GUI 来选择文件也是受欢迎的):
file-receive -p PASSWORD file2
我现在最接近的方法是这个 hack,它可以工作但不太舒服并且会给 Windows 用户带来一些麻烦:
tar cf - [files]... | gpg -c --passphrase PASSWORD | nc -l -p 6666
nc host1 6666 | gpg --passphrase PASSWORD | tar xf - [files]...
更多说明:
- 两个用户都没有 root 访问权限(因此没有服务器访问端口 <1024)
- 应避免在提供文件之前复制文件(即不
cp files /var/www/
) - ssh/scp 不起作用,因为这需要将一个主机的密码提供给另一个主机
- 使用 rsync 和 rsyncd.conf 大多情况下是可行的,但设置起来很麻烦,而且不提供共享单个文件的方法,只提供目录
- 可以使用单个命令行启动和配置的 ftp/http 服务器可以工作,欢迎使用 https 支持加密,以及共享单个文件而不仅仅是目录的方式,不知道有哪个服务器符合这些标准
- USB 不是一个选项,因为其他主机可能只能通过网络使用
- 文件上传服务也不是一种选择(文件大小限制、上传到不受信任的第三方、用户可能在局域网上而不是互联网上等等)
答案1
$ gpg -e mysecretfile
You did not specify a user ID. (you may use "-r")
Current recipients:
Enter the user ID. End with an empty line: ben
Current recipients:
2048g/52FFA1E 2009-01-02 "Bob McBlah <[email protected]>"
Enter the user ID. End with an empty line:
$ ls *.gpg
mysecretfile.gpg
现在文件mysecretfile.gpg
已经加密,只有本人(Bob McBlah)才能解密(非对称或公钥加密)。
可以使用任何能够发送文件的媒介(netcat、电子邮件、FTP、dropbox、mediafire.com 等等)安全地发送文件,几乎没有被拦截的风险。
如果您使用-a
“ASCII 装甲”标志,则加密文件(将被命名为mysecretfile.asc
)是纯 ASCII 文本,可以通过任何可以发送 ASCII 文本的介质发送,因此对任何其他“如何发送 x MB 文件”问题的答案都适用。
为了解决您的特定问题,也许可以使用 BaseHTTPServer 模块编写一个简单的 Python 脚本:
import sys
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
thefile = None
class MyHandler(BaseHTTPRequestHandler):
def do_GET(self):
global thefile
try:
if self.path == "/":
f = open(thefile)
self.send_response(200)
self.send_header('Content-type', 'application/x-gpg')
self.send_header('Content-disposition', 'filename="%s"' % thefile.replace("\"", ""))
self.end_headers()
self.wfile.write(f.read())
f.close()
else:
self.send_error(404, 'File not found: %s' % self.path)
except IOError:
self.send_error(404,'File Not Found: %s' % self.path)
def main():
global thefile
if len(sys.argv) == 2:
thefile = sys.argv[1]
else:
print "Usage: %s [path to served file]" % sys.argv[0]
sys.exit(1)
try:
server = HTTPServer(('', 8080), MyHandler())
print 'Started server on port 8080'
server.serve_forever()
except KeyboardInterrupt:
print 'Keyboard abort, shutting down server'
server.socket.close()
if __name__ == '__main__':
main()
另存为servefile.py
并运行python servefile.py /path/to/my/file.gpg
上述代码并不是很好,但对于一次性转移来说应该足够了。
答案2
交出 USB 驱动器可行吗?这可能太麻烦了,但它可以解决连接到不受信任的计算机的问题。此外,对于任何操作系统的用户来说,只需最少的说明即可提取所需的文件,这并不困难。
答案3
如果两台电脑都连接到互联网,可能会出现类似DropBox是可以接受的。
答案4
如果你正在寻找轻量级的网络服务器维基百科上的此页面可能有帮助。