1

Я хочу надежно копировать файлы с одного компьютера на другой, однако другой компьютер не является доверенным, и у меня нет прямого доступа к нему, кроме как дать владельцу компьютера инструкции. Кроме того, это единовременная ситуация, поэтому следует избегать любых громоздких настроек. Какой самый простой и удобный способ сделать это?

Я имею в виду программу со следующим рабочим процессом:

  1. Хост с файлами выдает гипотетическую команду, чтобы сделать файлы доступными, защищенными паролем:

    file-offer -p PASSWORD file1 file2 file3 directory

  2. Другой использует гипотетическую команду с паролем для получения файла (приветствуется также графический интерфейс для выбора файлов):

    file-receive -p PASSWORD file2

Самое близкое, что у меня есть сейчас, - это взлом, который работает, но не очень удобно и доставит пользователям Windows некоторые проблемы:

  1. tar cf - [files]... | gpg -c --passphrase PASSWORD | nc -l -p 6666

  2. nc host1 6666 | gpg --passphrase PASSWORD | tar xf - [files]...

Еще несколько заметок:

  • ни один из пользователей не имеет root-доступа (поэтому серверы не обращаются к портам <1024)
  • следует избегать копирования файлов до их доступности (т.е. никаких cp files /var/www/)
  • ssh /scp не работает, так как это потребует передачи пароля одного хоста другому
  • использование rsync с rsyncd.conf в большинстве случаев работает, но неудобно в настройке и не позволяет совместно использовать один файл, только каталоги
  • сервер ftp /http, который можно запустить и настроить с помощью одной командной строки, может работать, приветствуется поддержка шифрования https, а также способ обмениваться отдельными файлами вместо просто каталогов, не знаю ни одного сервера, который соответствует этим критериям
  • USB не вариант, так как другой хост может быть доступен только по сети
  • служба загрузки файлов также не подходит (ограничения по размеру файла, загрузка не доверенному третьему лицу, пользователь может находиться в локальной сети, а не в Интернете и т. д.)

7 ответов7

6

Возможна ли передача с USB-накопителя? Это может быть слишком громоздким, но это решит проблему подключения к ненадежному компьютеру. Кроме того, пользователям любой ОС не составит труда извлечь необходимые файлы с минимальными инструкциями.

3

Если оба компьютера подключены к Интернету, возможно, что-то вроде DropBox будет приемлемым.

2
  • Создайте временного пользователя с паролем, но без доступа к оболочке (например, с помощью scponly).
  • Дайте этому пользователю права на файлы.
  • Скопируйте файлы с помощью SCP.
  • Как только все будет сделано, удалите этого пользователя.
2

GnuPG шифрование !

$ 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 <bob.mcblah@example.com>"

Enter the user ID.  End with an empty line: 

$ ls *.gpg
mysecretfile.gpg

Файл mysecretfile.gpg теперь зашифрован таким образом, что только человек (Боб Макблах) может расшифровать файл (асимметричное шифрование или криптография с открытым ключом).

Файл можно безопасно отправить с помощью любого носителя, способного отправлять файл (netcat, электронная почта, FTP, dropbox, mediafire.com и т.д.), Практически без риска перехвата.

Если вы используете флаг -a "ASCII armor", зашифрованный файл (который будет называться mysecretfile.asc) представляет собой простой текст ASCII, который можно отправлять на любом носителе, который может отправлять текст ASCII, поэтому отвечает на любой другой вопрос "как можно" Я отправляю файл x MB "вопрос будет применим ..

Для решения вашей конкретной проблемы, возможно, можно написать простой скрипт на Python с использованием модуля BaseHTTPServer:

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

Приведенный выше код не совсем хорош, но должен подойти для одноразовых переводов.

1

Если вы ищете легкий веб-сервер, эта страница в Википедии может помочь.

1

SSH может использовать аутентификацию с открытым / закрытым ключом. Это позволяет вам дать "ненадежному" компьютеру ваш открытый ключ. Затем вы сохраняете свой секретный ключ в секрете и пароль, а затем вы можете войти на другой компьютер.

Затем вы можете проверять файлы, пока у пользователя, с которым вы работаете, есть соответствующие разрешения. И поскольку вы используете SSH, все файлы зашифрованы при передаче.

1

Вы также можете создать бесплатную учетную запись на Inbox.com. Одной из их услуг (помимо электронной почты) является хранение файлов до 5 ГБ (также бесплатно). Просто создайте учетную запись, которой вы оба можете поделиться, загрузить свои файлы и позволить другому человеку загружать их. После этого забудьте про учетную запись, измените пароль и сохраните его или делайте с ним все, что хотите.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .