Попытка отправить файл с помощью zmodem с помощью lrzsz через сервер telnet java

Я пытаюсь использовать lrzsz для отправки файла с помощью zmodem, прочитав stdio в Java и перенаправив его в сокет подключенного клиента.

private void sendFiles(ArrayList<String> filenames) {
    Process p;
    ProcessBuilder pb;

    filenames.add(0, "/opt/local/bin/sz");

    try {

        pb = new ProcessBuilder(filenames);

        p = pb.start();

        InputStreamReader  lrzszin = new InputStreamReader(p.getInputStream());
        OutputStreamWriter lrzszout = new OutputStreamWriter(p.getOutputStream());

        InputStreamReader telnetin = new InputStreamReader(socket.getInputStream());
        OutputStreamWriter telnetout = new OutputStreamWriter(socket.getOutputStream());


        while (p.isAlive()) {
            if (lrzszin.ready()) {
                telnetout.write(lrzszin.read());
                telnetout.flush();
            }
            if (telnetin.ready()) {
                lrzszout.write(telnetin.read());
                lrzszout.flush();
            }
        }


    } catch (IOException ex) {

    } 
}

Однако загрузки zmodem происходят из-за повреждения. и это ошибки.

2 ответа

Решение

Отвечая на мой собственный вопрос...

Мне нужно было добавить правильные кодировки символов во входной и выходной потоки.

        BufferedReader  lrzszin = new BufferedReader(new InputStreamReader(p.getInputStream(), "ISO-8859-1"));
        BufferedWriter lrzszout = new BufferedWriter(new OutputStreamWriter(p.getOutputStream(), "ISO-8859-1"));

        BufferedReader telnetin = new BufferedReader(new InputStreamReader(socket.getInputStream(), "ISO-8859-1"));
        BufferedWriter telnetout = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "ISO-8859-1"));

В то время как опция Telnet SEXYZ учитывает символы IAC, я не уверен, что lrzsz делает (вероятно, нет), поэтому я добавил предложение Брайана об их экранировании.

Вы пометили свой вопрос как "telnet", но вы явно не говорите, что используете telnet для удаленного подключения.

Telnet не 8-битный чистый. Он использует символы "escape" для обмена информацией о конфигурации между клиентом и сервером. Ваша программа передачи, скорее всего, ожидает необработанное соединение.

Вы можете попробовать реализовать базовую поддержку Telnet в своем приложении. Для ваших целей это, вероятно, означает просто экранирование и отмена экранирования символа IAC (0xFF), который используется для префикса команд Telnet. Интерфейсы Telnet преобразуют эти байты из необработанного потока в двойные символы IAC в сети, очень похоже на "\\" в строке, чтобы получить один обратный слеш.

Нет смысла использовать zmodem через сетевые интерфейсы - он был разработан для последовательных линий, которые не имели встроенного обнаружения / исправления ошибок. scp или же rsync (который использует ssh) Ваши лучшие ставки, хотя я иногда использую socket программа (или netcat) создать необработанный порт прослушивания и напрямую подключиться к нему для передачи файлов.

Машина 1: socket -q -l 12345 <archive.zip

Машина 2: socket -q machine1 12345 >archive.zip

(команды набираются по памяти и не могут быть строго точными)

Другие вопросы по тегам