elfmz/far2l

Feature: Consider porting FISH(FIle transfer over SHell filesystem) from Midnight Commander

vasya-r7 opened this issue · 322 comments

Midnight Commander has FISH.
And FISH is brilliant IMHO and superfast! It would be so nice to get FISH with far2l.

FISH supports jump hosts which NetRocks is lacking nowadays.
FISH can be used instead SFTP most of the times.
FISH is faster comparing to SFTP. Dirs listing is faster and download/upload speeds are much better.
For example with my 30 MBit Internet transferring files with FISH via Midnight Commander saturates Internet link. SFTP via far2l download speeds are several times less than FISH(2-6x). I have Little Snitch firewall app which displays link speed in menubar. I`ve never saw SFTP via far2l saturating internet link.

Take a look at screenshots for the same file(0017.MOV) transferred via SFTP(far2l) and FISH(mc). It took MC 1 minute 23 seconds compared to Far2l (SFTP) with 2 minutes 48 seconds to transfer the same file. I repeated the test several times. Result is consistent during repetitions.

As for my system I`m using MacOs on MacBook Air M1 with Ventura 13.4. Far2l(2.5.2-beta) and MC(4.8.30 from macports) are latest as of the time of writing.

Thank you for far2l, it`s great!

image image image image
unxed commented

https://en.wikipedia.org/wiki/Files_transferred_over_shell_protocol
?

SCP in NetRocks is very close afaik. If you could point us to the differences, it would be indeed helpful.

SCP is fast you are right. Thanks for pointing that out.

FISH & SCP are rather similar to each other.
However FISH has 2 significant implementation differences.

  1. FISH stores commands used in separate scripts files instead hardcoding them in c/cpp code.
    You can see that commands here if you like.
    https://github.com/MidnightCommander/mc/tree/master/src/vfs/fish/helpers

  2. FISH uses OpenSSH client stdin/stdout without trying to implement SSH proto in any way or connect to SSH on it`s own.

P.S.: I badly miss JumpHosts support with NetRocks.

unxed commented

As for 2, I am now trying to write NetRocks alternative as wrapper around command line sftp tool just as multiarc wraps around zip or tar. Is it something similar to what FISH in mc does?

https://github.com/unxed/netpanel

PS: Just PoC as for now, but still I was able to make ununtu-ubuntu connection and download a file.

elfmz commented

2unxed consider adding protocol to NetRocks instead of full plugin implementation. See https://github.com/elfmz/far2l/blob/master/NetRocks/HACKING.txt

https://github.com/unxed/netpanel

It seems to me that porting readily available and working code from Midnight would be simpler task than writing wrapper around sftp from scratch. FISH is rather primitive. And FISH commands stored in separated files can be just reused. Also FISH can be extended in almost any way you can imagine cause it just executes commands on remote server. With SFTP wrapper you are limited to standard SFTP client functionality and it`s limitations.

P.S.: Execute Midnight and try FISH. It works so good.

unxed commented

@elfmz извините, что на русском, но я немного устал и плохо соображаю. Думал в эту сторону, но есть проблемка: насколько я успел понять апи брокеров протоколов, там надо уметь возможность читать-писать по произвольному смещению. Консольная sftp не даёт такое. Теоретически такое можно было бы эмулировать, используя возможность докачки, и создавая пустой файл нужного размера, но это как-то совсем уж причудливо: писать такое, не обсудив сперва с коллегами, я не рискнул :) и ещё я сразу предупреждаю, что задолбаю вопросами про ipc и многопоточность, потому что в нетроксе уровень сей явно выше моего, и мне конечно, дико интересно разобраться во всем этом, но тупить на старте буду конкретно :)

Below is google translation
@elfmz sorry for the Russian, but I'm a little tired and I'm bad at thinking. I thought in this direction, but there is a problem: as far as I managed to understand the api of protocol brokers, there you need to be able to read and write at an arbitrary offset. Console sftp does not give this. Theoretically, this could be emulated using the resume option and creating an empty file of the required size, but it’s somehow quite bizarre: I didn’t risk writing this without discussing it with my colleagues first :) and I also immediately warn that I’ll fill up with questions about ipc and multithreading, because in netrocks C/C++ level is clearly higher than mine, and of course, it’s wildly interesting for me to understand all this, but I’ll be stupid at the start :)

unxed commented

Used fish already. Good thing. Definitely porting from mc to netrocks API could be best solution if possible.

elfmz commented

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

Небязательно. scp тоже не умеет по произвольному и делает так:

	if (resume_pos) {
		throw ProtocolUnsupportedError("SCP doesn't support download resume");
	}

  • соответственно просто докачка не будет работать для этого протокола
unxed commented

И вот тут интересное. Докачка то как раз у консольного sftp есть. Вот нельзя ли как-то развинуть границы апи чтоб ее можно было использовать в том виде в котором она есть там?

unxed commented

Does FISH support download/upload resume in mc? @vasya-r7

Does FISH support download/upload resume in mc? @vasya-r7

FISH supports download/upload resume in mc.
P.S.: At least I`ve tested download resume.

elfmz commented

Докачка то как раз у консольного sftp есть. Вот нельзя ли как-то развинуть границы апи чтоб ее можно было использовать в том виде в котором она есть там?

Непонятно что раздвигать. Докачка у консолького sftp есть - так она и у нетроксовского sftp тоже есть. А у консолького scp докачки нету. А что есть у fish - это отдельный вопрос. В любом случае апи позволяет как протоколы с докачкой так и без.

unxed commented

Раздвигать в том смысле чтоб докачка поддерживалась не только при доступности чтения/записи по любому смещению, но и по доступности опции "вот лежит недокачанный файл, докачивай с места, соответствующего его объему, и пиши в него же", как это в sftp сделано. Иначе придется эмулировать первый вариант поверх второго и это какаято дичь

elfmz commented

Но.. ведь так и сделано же: https://github.com/elfmz/far2l/blob/master/NetRocks/src/Protocol/Protocol.h#L91
или я чегото не понимаю..

unxed commented

API VFS mc выглядит так. @elfmz как думаете, этого достаточно для NetRocks? Т.е. можно сделать просто прокладку из одного API в другой?

void
vfs_init_fish (void)
{
    tcp_init ();

    vfs_init_subclass (&fish_subclass, "fish", VFSF_REMOTE | VFSF_USETMP, "sh");
    vfs_fish_ops->fill_names = fish_fill_names;
    vfs_fish_ops->stat = fish_stat;
    vfs_fish_ops->lstat = fish_lstat;
    vfs_fish_ops->fstat = fish_fstat;
    vfs_fish_ops->chmod = fish_chmod;
    vfs_fish_ops->chown = fish_chown;
    vfs_fish_ops->utime = fish_utime;
    vfs_fish_ops->open = fish_open;
    vfs_fish_ops->symlink = fish_symlink;
    vfs_fish_ops->link = fish_link;
    vfs_fish_ops->unlink = fish_unlink;
    vfs_fish_ops->rename = fish_rename;
    vfs_fish_ops->mkdir = fish_mkdir;
    vfs_fish_ops->rmdir = fish_rmdir;
    vfs_fish_ops->ctl = fish_ctl;
    fish_subclass.archive_same = fish_archive_same;
    fish_subclass.new_archive = fish_new_archive;
    fish_subclass.open_archive = fish_open_archive;
    fish_subclass.free_archive = fish_free_archive;
    fish_subclass.fh_new = fish_fh_new;
    fish_subclass.fh_open = fish_fh_open;
    fish_subclass.dir_load = fish_dir_load;
    fish_subclass.file_store = fish_file_store;
    fish_subclass.linear_start = fish_linear_start;
    fish_subclass.linear_read = fish_linear_read;
    fish_subclass.linear_close = fish_linear_close;
    vfs_register_class (vfs_fish_ops);
}

Там, похоже, даже чтение по произвольному смещению есть:

static int
fish_linear_start (struct vfs_class *me, vfs_file_handler_t * fh, off_t offset)
unxed commented

И ещё. mc вроде бы под gpl 3. Плагин к нетроксу с использованием его кода точно легально делать?

unxed commented

Так, я тут поизучал, как FISH в mc сделан. Офигел от гениальности. Это такая же обёртка, как я вокруг sftp хотел сделать, только вокруг ssh или rsh. То есть ей даже sftp-клиент консольный не нужен, а уж ssh клиент точно есть везде.

Там в комплекте с реализацией FISH — пачка скриптов, их содержимое передаётся через стандартный ввод (stdin) процессу удалённой оболочки. И они на той стороне уже делают то что нужно — переименовывают скажем файл или отдают его байты с такого-то по такой-то. Ну и зависимостей никаких, кроме консольного ssh клиента, опять же.

Теперь мне кажется, что надо просто всю реализацию из mc в far2l в форме плагина к Нетроксу портировать, а не изобретать велосипед. Не могу правда пока решить, как лучше — только саму fish или в принципе прокладку для любой VFS mc делать. Там ещё реализация VFS у них за собой может пол mc всяких либ потянуть.

unxed commented

mc's VFS API needs GLib, and since the whole concept is to implement sftp-without-dependencies, this doesn't really suit me. So, apparently, it's easier to make own implementation of FISH based on my NetPanel in the form of a protocol plugin for NetRocks, using helper scripts from mc. Moreover, among its VFS, there is nothing else of particular interest to us, except undelete that can be also ported later.

unxed commented

For those who are interested in my attempts to implement FISH like in mc. Here are early experiments. Currently working is a class with partial FISH implementation, and it can only connect, log in (by password or crypto key) and get a list of files, and a demo tool for this class. See readme.txt (in Russian only currently, sorry).

Further, in principle, is already a matter of technology.

FISH.TAR.GZ

PS: It even can remember password, that mc can not.

Update from September 26, 2023: I, the author of the sources posted in this message, allow dual licensing of source code used in commit 9a5b427, both under mc-compatible licence and under the terms of GPL version 2.

unxed commented

The FISH NetRocks plugin has been brought to the state "can show a list of files from a remote server on far2l's panel" (however, nothing else can be done yet :)

Details are in readme.txt as as usual.

FISH.TAR.GZ

Update from September 26, 2023: I, the author of the sources posted in this message, allow dual licensing of source code used in commit 9a5b427, both under mc-compatible licence and under the terms of GPL version 2.

unxed commented

oh, it's so early :)

unxed commented

о, я вижу, вы там что-то делали с кодом. а почему там лучше std::string, а не std::filesystem::path?

unxed commented

не очень понял, @elfmz вы дальше сами? или это просто исправление ошибок за мной и я могу понемногу дальше пробовать имплементировать?

elfmz commented

думаю пока я это переделаю чутка и потом можно вместе имплементировать

unxed commented

Аххаха надеюсь я не перестану понимать, как всё устроено, к тому моменту :)
btw, там ещё как-то скриптам из helpers параметры передавать нужно, типа пути к папке для ls
Пока не успел разобраться, как это правильно делать, и как это делалось в mc.

unxed commented

Ещё там хорошо бы ошибки обрабатывать, вот эти цифры после ###

А ещё уже после придумывания, как передать пароль так, чтоб ssh его съел (обычная отправка на stdin через pipe не срабатывает), узнал, что не один я этот фокус изобрел:
https://sysadmin.pm/sshpass/
В её код полезно может быть глянуть тоже:
https://github.com/kevinburke/sshpass

unxed commented

Хм, у меня после последних двух коммитов соединяться перестало, так и должно быть?

elfmz commented

не должно, у меня наоборот ща заработали переходы по директориям

unxed commented

На хост, где авторизация по паролю, заходит норм! И по папкам там ходит и типы и размер файлов показывает правильно, кайф!

А вот на хост, где авторизация по файлу-ключу, до сих пор не заходит. Виснет на «Connecting to site».

PS: Оставлю тут ссылку на веточку, чтоб людям за изменениями проще следить было:
https://github.com/elfmz/far2l/tree/nr-fish

unxed commented

Вот на этой строчке виснет, если авторизация по ключу, ключ подходит и знакомый:

	wr = _fish->SendHelperAndWaitReply("FISH/info", {"\n### 200", "\n### "});

Замена на

	wr = _fish->SendHelperAndWaitReply("FISH/info", {"\n### 200", "\n### ", "$ "});

проблему решает, но перестаёт работать чтение списка файлов, когда заходишь по паролю.

elfmz commented

то есть каким то фигом между 127 и ### 200 вылезла куча шелловских пришглашений..

elfmz commented

а, понятно

elfmz commented

А сейчас? Кстати, еще и get должен заработать

unxed commented

Спасибо! Не у компа, ближе к ночеру смогу глянуть

unxed commented

Попросил потестить в чате пока :)

unxed commented

В чате пишут:
При попытке соединиться на *wrt, висит до бесконечности на "Connecting to site"

Коннект на fish:user@localhost тоже висит до бесконечности на "Connecting to site".
В системных логах пишет:
Failed password for user from 127.0.0.1 port 41582 ssh2
Просто ssh user@localhost после набора пароля руками соединяется без проблем.

Даже если закрыть far2l, остаются висеть запущенные плагином процессы ssh с установленным коннектом

ProtocolFISH.cpp:

    // везде ли "$ " признак успешного залогина? проверить на dd wrt

    // Мы таки залогинены, спрашивают пароль, ключ незнакомый?
    std::vector<std::string> results = {"$ ", "password: ", "This key is not known by any other names"};


Вот пример выводы ssh root@openwrt


BusyBox v1.36.1 (2023-08-30 22:49:29 UTC) built-in shell (ash)

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 -----------------------------------------------------
 OpenWrt SNAPSHOT, r23860-c5b7be8316
 -----------------------------------------------------
root@OpenWrt:~#

Имеет смысл добавить "# ", "Enter passphrase for key " ?
И "% " для zsh
А у некоторых стоит fish ("> ") shell или powerline, где PS1 меняется до неузнаваемости...

elfmz commented

добавил #
прочие > и т.п. будем добавлять по мере багов, универсального решения тут явно не предвидится

unxed commented

А как они в mc эту проблему решают? Через час у компа буду

Стало соединяться с компом (Ubuntu) и Openwrt. !
Но показывает пустые начальные каталоги. А они, естественно, не пустые.
Дальше на любое действие выдает ошибку.

unxed commented

Download работает с хоста, куда входишь по паролю, но не работает с хоста, куда входишь по ключу. Может, причина в какой-то другой разнице между ними, но и там и там убунтовый сервер (может версий разных, не помню точно).

unxed commented

Да, и по поводу всяких разных промптов. Может, просто сразу слать echo 'MY_RANDOM_TOKEN' и потом этого токена и ждать? Типа если пришёл то у нас есть какой-никакой живой шелл с другой стороны.

elfmz commented

Но показывает пустые начальные каталоги. А они, естественно, не пустые.

Замечу что после make install fish еще не работает толком, так как не копируются хелперы, так что тестить пока мона тока из билда. После make install поведение как раз такое - показывает пустые хосты

elfmz commented

вот теперь make install нормально ставит все

elfmz commented

..и сразу интересный спецэффект обнаружил - если стартовать far2l из терминала то все ок, а если из гуя, то далеко не ок. Чета терминал с ssh-ем глючит видимо.

unxed commented

я из гуя тестирую как раз.

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

у меня в гуе всё из заявленного ок, кроме возможности скачать файл с сервера, куда по ключу вхожу.

elfmz commented

У меня из гуя глючит а из терминала все ок. Я имею ввиду запуск самого far2l, а не его бэкенд. В обоих случаях это гуишный far2l. Просто запускаемый из xfce меню - глючит, а из терминала - работает.

unxed commented

Воу! Даже не знаю что сказать :) Потому что у меня просто хоткей когда-то давно настроен на запуск far2l по Alt+F3 (единственное кажется свободное из удобного было), и я даже уже не помню, какая аппа это делает.

elfmz commented

Оказалось надо setenv("TERM",...) сделать было

unxed commented

Вот этот момент, когда не получается получить файл с сервера, в логе выглядит так:

*** LIST READ
NetRocks::OpBase('.'): count=0 all_total=0
CommandLine::ShowBackground: done
ConsoleInput::Enqueue: # 0 23 100 DOWN
ConsoleInput::Enqueue: # 0 23 100 UP
ConsoleInput::Enqueue: # 0 72 0 DOWN
NetRocks::GetFiles: _dir='<fish:unxed@runcity.org>' DestPath='/tmp/far2l_3e8_0/FTM38d6.tmp' ItemsNumber=1 OpMode=5
CurrentSiteDir: out='./'
PluginManager::BackroundTaskStarted('NR') - count=1
*** ProtocolFISH::GetInformation
Enum './test.txt'
*19 path='./test.txt'
ConsoleInput::Enqueue: # 0 72 0 UP
FISHLS: '> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > P-rwxrwxrwx 1003 1004'
FISHLS: 'S4'
FISHLS: 'dAug 3 16:17'
FISHLS: ':./test.txt'
FISHLS: '### 200'
*** LIST READ
PluginManager::BackroundTaskFinished('NR') - count=0
NetRocks::OpBase('./'): count=0 all_total=0
CommandLine::ShowBackground: done
FSNotify: watching 1 entries for '/home/unxed'
unxed commented

Смена папки на сервере, куда входишь по ключу, не работает тоже.

изображение

unxed commented

ОС на сервере, куда хожу по ключу:

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.5 LTS"
elfmz commented

А если вот это
_fish->SendAndWaitReply("export PS1=; echo '###'FISH'###'\r", {"###FISH###\n"});
поменять на
_fish->SendAndWaitReply("export PS1=; export PS2=; export PS3=; export PS4=; export PROMPT_COMMAND=; echo '###'FISH'###'\r", {"###FISH###\n"});

unxed commented

изображение

unxed commented

изображение

unxed commented
*** login string from config: unxed@runcity.org
ConsoleInput::Enqueue: 
 d d 0 UP
*** CONNECTED
NetRocks::OpBase('fish:unxed@runcity.org'): count=0 all_total=0
NetRocks::ValidateLocationDirectory - dir: ''
NetRocks::GetFindData '<fish:unxed@runcity.org>'
CurrentSiteDir: out='.'
Enum '.'
*19 path='.'
FISHLS: 'R700 40000 1003.1004'
FISHLS: 'S4096'
FISHLS: 'd01-03-2023 08:57'
FISHLS: ':".config"'
FISHLS: 'R600 100000 0.0'
FISHLS: 'S1754'
FISHLS: 'd02-26-2021 18:43'
FISHLS: ':".bash_history"'
elfmz commented

а ща?

unxed commented

Хождение по папкам починилось. Скачивание файлов всё ещё не работает.

изображение

unxed commented

Создается скачанный файл, но он пустой.

unxed commented

Релевантный кусок лога:

NetRocks: starting broker '/home/unxed/far2l/far2l/build/install/Plugins/NetRocks/plug/NetRocks-FISH.broker' '15' '21'
22096: HostRemoteBrokerMain: BEGIN
*1
*** ProtocolFISH::ProtocolFISH
*** CONNECTING
*** host from config: runcity.org
*** port from config: 22
*** username from config: unxed
*** password from config: 
*** login string from config: unxed@runcity.org
ConsoleInput::Enqueue: # 0 28 100 UP
ConsoleInput::Enqueue: 
 d d 0 UP
*** CONNECTED
*** info=119
NetRocks::OpBase('fish:unxed@runcity.org'): count=0 all_total=0
NetRocks::ValidateLocationDirectory - dir: ''
NetRocks::GetFindData '<fish:unxed@runcity.org>'
CurrentSiteDir: out='.'
Enum '.'
*19 path='.'
*** LIST READ
NetRocks::OpBase('.'): count=0 all_total=0
CommandLine::ShowBackground: done
ConsoleInput::Enqueue: # 0 23 100 DOWN
ConsoleInput::Enqueue: # 0 23 100 UP
ConsoleInput::Enqueue: # 0 74 0 DOWN
NetRocks::GetFiles: _dir='<fish:unxed@runcity.org>' DestPath='/home/unxed/1111111' ItemsNumber=1 OpMode=0
CurrentSiteDir: out='./'
ConsoleInput::Enqueue: # 0 74 0 UP
ConsoleInput::Enqueue: 
 d d 0 DOWN
PluginManager::BackroundTaskStarted('NR') - count=1
*** ProtocolFISH::GetInformation
Enum './test.txt'
*19 path='./test.txt'
ConsoleInput::Enqueue: 
 d d 0 UP
*** LIST READ
22085: stat failed (2)
*24
NetRocks::OpBase('./', 129): DispatchInterThreadCalls returned 1
*** ProtocolFISH::GetSize
*** ProtocolFISH::GetInformation
Enum './test.txt'
*19 path='./test.txt'
*** LIST READ
ConsoleInput::Enqueue: � 1b 1b 0 DOWN
ConsoleInput::Enqueue: � 1b 1b 0 UP
ConsoleInput::Enqueue: � 1b 1b 0 UP
PluginManager::BackroundTaskFinished('NR') - count=0
NetRocks::OpBase('./'): aborted
NetRocks::GetFindData '<fish:unxed@runcity.org>'
CurrentSiteDir: out='.'
Enum '.'
*19 path='.'
*** LIST READ
NetRocks::OpBase('.'): count=0 all_total=0
FSNotify: watching 1 entries for '/home/unxed/1111111'
CommandLine::ShowBackground: done
CommandLine::ShowBackground: done
ConsoleInput::Enqueue: 	 9 9 0 DOWN
ConsoleInput::Enqueue: 	 9 9 0 UP
ConsoleInput::Enqueue: 	 9 9 0 UP
ConsoleInput::Enqueue: # 0 79 0 DOWN
ConsoleInput::Enqueue: # 0 79 0 UP
ConsoleInput::Enqueue: 
 d d 0 DOWN
CommandLine::ShowBackground: done
PipeIPCError: PipeIPCRecver: read (0)
*** ProtocolFISH::~ProtocolFISH
If you see this in output - uncomment code below and check again
Child exited with status 65280
22096 HostRemoteBrokerMain: PipeIPCRecver: read (0)
22096: HostRemoteBrokerMain: END
SudoAskpassServer::Thread finished
elfmz commented

а ща?

unxed commented

ура, заработало! (и смена папок на сервере, куда входишь по ключу, и скачивание файлов оттуда)

unxed commented

о, дебаг нормальный, как раз сам такое хотел делать))

unxed commented

при этом в консоли far2l туда норм ходит:

~/far2l/far2l/far2l/NetRocks/src/Protocol/FISH$ ssh root@192.168.55.1
DD-WRT v24-sp2 std (c) 2013 NewMedia-NET GmbH
Release: 04/01/13 (SVN revision: 21153)
root@192.168.55.1's password:
==========================================================

 ____  ___    __        ______ _____         ____  _  _
 | _ \| _ \   \ \      / /  _ \_   _| __   _|___ \| || |
 || | || ||____\ \ /\ / /| |_) || |   \ \ / / __) | || |_
 ||_| ||_||_____\ V  V / |  _ < | |    \ V / / __/|__   _|
 |___/|___/      \_/\_/  |_| \_\|_|     \_/ |_____|  |_|

                       DD-WRT v24-sp2
                   http://www.dd-wrt.com

==========================================================


BusyBox v1.21.0 (2013-04-01 09:26:04 CEST) built-in shell (ash)
Enter 'help' for a list of built-in commands.

root@hascky:~#
unxed commented

После последнего коммита стало ой как интересно:

ConsoleInput::Enqueue: 3 33 33 0 DOWN
ConsoleInput::Enqueue: 3 33 33 0 UP
ConsoleInput::Enqueue: 3 33 33 0 UP
ConsoleInput::Enqueue: 
 d d 0 DOWN
NetRocks::OpBase('fish:root@192.165.55.1', -1): DispatchInterThreadCalls returned 1
NetRocks::OpBase('fish:root@192.165.55.1', -1): DispatchInterThreadCalls returned 1
NetRocks::OpBase('fish:root@192.165.55.1', -1): DispatchInterThreadCalls returned 1
NetRocks::OpBase('fish:root@192.165.55.1', -1): DispatchInterThreadCalls returned 1
*1
*** ProtocolFISH::ProtocolFISH
*** CONNECTING
*** host from config: 192.165.55.1
*** port from config: 22
*** username from config: root
*** password from config: *****
*** login string from config: root@192.165.55.1
ConsoleInput::Enqueue: 
 d d 0 UP
ConsoleInput::Enqueue: # 0 12 2 DOWN
ConsoleInput::Enqueue: # 0 12 0 UP
STDERR: ssh: connect to host 192.165.55.1 port 22: Network is unreachable{0d}
STDERR: {0a}
STDERR: 

При этом в командной строке всё соединяется.

unxed commented

Может, штука тут не в dd-wrt, а в том, что я по IP соединяюсь, а не по имени хоста?

elfmz commented

точно 192.165.55.1 а не 192.168.55.1?

unxed commented

упс! извините)) вот нельзя потому что за комп когда спать хочеш

unxed commented

Но оно всё равно не работает. Висит белое окно "Connecting to site..."

Ух ты, ещё и лог в буфер не копируется! Там символы с кодом 0, что ли? (кстати вот бы починить этот баг, в фар3 починили вроде)

far2l_1.log

elfmz commented

а что происходит если в ручном ssh к этому серверу написать команду
bind 'set enable-bracketed-paste off';export PS1=;export PS2=;export PS3=;export PS4=;export PROMPT_COMMAND=;echo '###'FISH'###'
?

unxed commented
root@hascky:~# bind 'set enable-bracketed-paste off';export PS1=;export PS2=;exp
ort PS3=;export PS4=;export PROMPT_COMMAND=;echo '###'FISH'###'
-sh: bind: not found
###FISH###
elfmz commented

ну то есть все норм.

unxed commented

-sh: bind: not found

А это точно норм?

elfmz commented

да, главное что ###FISH### вывелось, его ведь ждет

У меня соединяется только с OpenWRT.

На других хостах стоит авторизация по public key authentication (по файлу-ключу) + на них стоит zsh.
По умолчанию с ними соединение не идет - до бесконечности висит на «Connecting to site».
Для соединения сними приходится править ProtocolFISH.cpp - обрабатывать:

  1. "% "
  2. "Enter passphrase for key"

Многие хосты с zsh еще пока не победил - нужно на них убирать POWERLINE / POWERLEVEL
Но потом затыкается все на команде
bind 'set enable-bracketed-paste off';
В zsh её нет. Многие хосты на нее отвечают:
zsh: correct 'bind' to 'find' [nyae]?
и все, естественно, зависает.

Как это обходит mc?

Даты у файлов пока везде 01/01/70

unxed commented

Перевёл на русский страницу Википедии про FISH. Гляньте, пожалуйста: нет ли ошибок? Может, добавить что?

https://ru.wikipedia.org/wiki/Files_transferred_over_shell_protocol

elfmz commented

sh: correct 'bind' to 'find' [nyae]?
и все, естественно, зависает.

наверно надо просто отвечать "n\r" в ответ на появление "[nyae]?\n"

elfmz commented

bind 'set enable-bracketed-paste off' кстати нужен потому что без него новые bash'и суют escape последовательности \x1b[?2004h и \x1b[?2004l на каждой выводимой строке, хз зачем они это делают...

наверно надо просто отвечать "n\r" в ответ на появление "[nyae]?\n"

Это - да. Но могут быть еще другие варианты реагирования хоста на посылаемые команды. Получается достаточно универсального решения нет и надо выносить обработку "вывод хоста - ответ" во внешний скрипт или конфиг.

то без него новые bash'

Может первым делом определять тип шелла через хотя-бы echo $0 и если он bash, то только тогда отправлять bind 'set enable-bracketed-paste off' ?

unxed commented

Also suggested adding FISH support to rclone
rclone/rclone#7301

elfmz commented

Может первым делом определять тип шелла через хотя-бы echo $0 и если он bash, то только тогда отправлять bind 'set enable-bracketed-paste off' ?

Сделал так

Для соединения сними приходится править ProtocolFISH.cpp - обрабатывать:

Было бы неплохо увидеть PR ибо мне не на чем такое тестить

unxed commented

Поскольку разные вопросы с embedd'ом возникают постоянно, я готов нафандрайзить в чяте far2l на роутер, на который такая прошивка встанет, для опытов. @elfmz ?

UPD: А может у кого-то ненужный есть, и он согласится оплатить доставку до какого-нибудь удобного вам пункта выдачи.

unxed commented

На dd-wrt всё ещё не заходит, висит в "Connecting".

NetRocks: starting broker '/home/unxed/far2l/far2l/build/install/Plugins/NetRocks/plug/NetRocks-FISH.broker' '18' '21'
11338: HostRemoteBrokerMain: BEGIN
ConsoleInput::Enqueue: 
 d d 20 UP
NetRocks::OpBase('fish:root@192.168.55.1', -1): DispatchInterThreadCalls returned 1
ConsoleInput::Enqueue: 9 39 39 20 DOWN
ConsoleInput::Enqueue: 9 39 39 20 UP
ConsoleInput::Enqueue: 9 39 39 20 UP
ConsoleInput::Enqueue: 1 31 31 20 DOWN
ConsoleInput::Enqueue: 1 31 31 20 UP
ConsoleInput::Enqueue: 1 31 31 20 UP
ConsoleInput::Enqueue: 1 31 31 20 DOWN
ConsoleInput::Enqueue: 1 31 31 20 UP
ConsoleInput::Enqueue: 1 31 31 20 UP
ConsoleInput::Enqueue: 6 36 36 20 DOWN
ConsoleInput::Enqueue: 6 36 36 20 UP
ConsoleInput::Enqueue: 6 36 36 20 UP
ConsoleInput::Enqueue: 7 37 37 20 DOWN
ConsoleInput::Enqueue: 7 37 37 20 UP
ConsoleInput::Enqueue: 7 37 37 20 UP
ConsoleInput::Enqueue: 3 33 33 20 DOWN
ConsoleInput::Enqueue: 3 33 33 20 UP
ConsoleInput::Enqueue: 3 33 33 20 UP
ConsoleInput::Enqueue: 3 33 33 20 DOWN
ConsoleInput::Enqueue: 3 33 33 20 UP
ConsoleInput::Enqueue: 3 33 33 20 UP
ConsoleInput::Enqueue: 3 33 33 20 DOWN
ConsoleInput::Enqueue: 3 33 33 20 UP
ConsoleInput::Enqueue: 3 33 33 20 UP
ConsoleInput::Enqueue: 
 d d 20 DOWN
NetRocks::OpBase('fish:root@192.168.55.1', -1): DispatchInterThreadCalls returned 1
NetRocks::OpBase('fish:root@192.168.55.1', -1): DispatchInterThreadCalls returned 1
NetRocks::OpBase('fish:root@192.168.55.1', -1): DispatchInterThreadCalls returned 1
NetRocks::OpBase('fish:root@192.168.55.1', -1): DispatchInterThreadCalls returned 1
*1
*** host from config: 192.168.55.1
*** port from config: 22
*** username from config: root
*** password from config: 1234
*** FISH CONNECT: root@192.168.55.1
ConsoleInput::Enqueue: 
 d d 20 UP
STDERR: DD-WRT v24-sp2 std (c) 2013 NewMedia-NET GmbH{0a}
STDERR: Release: 04/01/13 (SVN revision: 21153){0a}
STDOUT: {0d}
STDOUT: root@192.168.55.1's password: 
SEND: 1234{0d}
STDOUT: {0a}
STDOUT: =========================================================={0a}
STDOUT:  {0a}
STDOUT:  ____  ___    __        ______ _____         ____  _  _ {0a}
STDOUT:  | _ \| _ \   \ \      / /  _ \_   _| __   _|___ \| || | {0a}
STDOUT:  || | || ||____\ \ /\ / /| |_) || |   \ \ / / __) | || |_ {0a}
STDOUT:  ||_| ||_||_____\ V  V / |  _ < | |    \ V / / __/|__   _| {0a}
STDOUT:  |___/|___/      \_/\_/  |_| \_\|_|     \_/ |_____|  |_| {0a}
STDOUT:  {0a}
STDOUT:                        DD-WRT v24-sp2{0a}
STDOUT:                    http://www.dd-wrt.com{0a}
STDOUT:  {0a}
STDOUT: =========================================================={0a}
STDOUT: {0a}
STDOUT: {0a}
STDOUT: BusyBox v1.21.0 (2013-04-01 09:26:04 CEST) built-in shell (ash){0a}
STDOUT: Enter 'help' for a list of built-in commands.{0a}
STDOUT: {0a}
STDOUT: @hascky:/tmp/root# 
*** FISH CONNECTED
SEND: export PS1=;export PS2=;export PS3=;export PS4=;export PROMPT_COMMAND=;echo '###':$0:FISH:'###'{0d}
ConsoleInput::Enqueue: # 0 12 22 DOWN
ConsoleInput::Enqueue: # 0 12 0 UP
ConsoleInput::Enqueue: # 0 12 22 DOWN
ConsoleInput::Enqueue: # 0 12 0 UP
ConsoleInput::Enqueue: # 0 12 22 DOWN
ConsoleInput::Enqueue: # 0 12 0 UP
ConsoleInput::Enqueue: # 0 12 22 DOWN
ConsoleInput::Enqueue: # 0 12 0 UP
ConsoleInput::Enqueue: # 0 12 22 DOWN
ConsoleInput::Enqueue: # 0 12 0 UP
ConsoleInput::Enqueue: # 0 12 22 DOWN
ConsoleInput::Enqueue: # 0 12 0 UP
ConsoleInput::Enqueue: # 0 12 22 DOWN
ConsoleInput::Enqueue: # 0 12 0 UP
unxed commented

Если я руками в терминале там шлю

export PS1=;export PS2=;export PS3=;export PS4=;export PROMPT_COMMAND=;echo '###':$0:FISH:'###'

то происходит вот чего

root@hascky:~# export PS1=;export PS2=;export PS3=;export PS4=;export PROMPT_COMMAND=;echo '###':$0:FISH:'###'
###:-sh:FISH:###

и тишина. Пробую что-нибудь нажимать:

ауа
-sh: ауа: not found
пкпк
-sh: пкпк: not found
ды
-sh: ды: not found
ls
ls
f
-sh: f: not found
g
-sh: g: not found
ls
ls
unxed commented

Тестить под роутеры без роутера ещё вот так, наверное, можно:
https://habr.com/ru/articles/414655/

elfmz commented

а если после
fprintf(stderr, "*** FISH CONNECTED\n");
вставить sleep(1)
?

unxed commented

висит с теми же симптомами.

STDOUT: BusyBox v1.21.0 (2013-04-01 09:26:04 CEST) built-in shell (ash){0a}
STDOUT: Enter 'help' for a list of built-in commands.{0a}
STDOUT: {0a}
STDOUT: @hascky:/tmp/root# 
*** FISH CONNECTED
SEND: export PS1=;export PS2=;export PS3=;export PS4=;export PROMPT_COMMAND=;echo '###':$0:FISH:'###'{0d}
ConsoleInput::Enqueue: # 0 12 22 DOWN
ConsoleInput::Enqueue: # 0 12 0 UP
elfmz commented

а если тут поменять \r на \n
'###':$0:FISH:'###'\r",

unxed commented

висит, но иначе (sleep я оставил):

STDOUT: BusyBox v1.21.0 (2013-04-01 09:26:04 CEST) built-in shell (ash){0a}
STDOUT: Enter 'help' for a list of built-in commands.{0a}
STDOUT: {0a}
STDOUT: @hascky:/tmp/root# 
*** FISH CONNECTED
SEND: export PS1=;export PS2=;export PS3=;export PS4=;export PROMPT_COMMAND=;echo '###':$0:FISH:'###'{0a}
STDOUT: ###:-sh:FISH:###{0a}
*** FISH SHELL: '-sh'
HELPER: FISH/info
ConsoleInput::Enqueue: # 0 12 22 DOWN
ConsoleInput::Enqueue: # 0 12 0 UP
unxed commented

mc по FISH туда ходит, что интересно

elfmz commented

а ну значит использовать \r было ошибкой, хотя вроде терминал шлет именно его

elfmz commented

ну как ща?

unxed commented

висим(

STDOUT: BusyBox v1.21.0 (2013-04-01 09:26:04 CEST) built-in shell (ash){0a}
STDOUT: Enter 'help' for a list of built-in commands.{0a}
STDOUT: {0a}
STDOUT: @hascky:/tmp/root# 
*** FISH CONNECTED
SEND: export PS1=;export PS2=;export PS3=;export PS4=;export PROMPT_COMMAND=;echo '###':$0:FISH:'###'{0a}
STDOUT: ###:-sh:FISH:###{0a}
*** FISH SHELL: '-sh'
HELPER: FISH/info
ConsoleInput::Enqueue: # 0 12 22 DOWN
ConsoleInput::Enqueue: # 0 12 0 UP
ConsoleInput::Enqueue: # 0 12 22 DOWN
ConsoleInput::Enqueue: # 0 12 0 UP
ConsoleInput::Enqueue: # 0 12 22 DOWN
ConsoleInput::Enqueue: # 0 12 0 UP
elfmz commented

а ща?

unxed commented

ура, заработало!

только если поставить working directory в /, тогда зависает на листинге, но если нажать cancel->abort->break — показывает правильный список файлов. потом при попытке в какую-то папку зайти показывает ошибку IPC, retry->cancel->abort->break->виден список файлов. если working directory не указывать, всё ок.

unxed commented

Кстати в оригинальном mc по-моему у всех скриптов переводы строк \r\n (или \n\r не помню, ну как в Винде).

unxed commented

Проблема с working directory воспроизводится только на dd-wrt

unxed commented

вот как выглядит зависон с working directory в логе

STDOUT: BusyBox v1.21.0 (2013-04-01 09:26:04 CEST) built-in shell (ash){0a}
STDOUT: Enter 'help' for a list of built-in commands.{0a}
STDOUT: {0a}
STDOUT: @hascky:/tmp/root# 
*** FISH CONNECTED
SEND: export PS1=;export PS2=;export PS3=;export PS4=;export PROMPT_COMMAND=;echo '###':$0:FISH:'###'{0a}
STDOUT: ###:-sh:FISH:###{0a}
*** FISH SHELL: '-sh'
HELPER: FISH/info
STDOUT: 119{0a}
STDOUT: ### 200{0a}
*** FISH INFO: 119
NetRocks::OpBase('fish:root@192.168.55.1'): count=0 all_total=0
NetRocks::ValidateLocationDirectory - dir: '/'
*** ProtocolFISH::GetMode
*** ProtocolFISH::GetInformation
Enum '/'
*19 path='/'
HELPER: FISH/ls
STDOUT: Pdrwxr-xr-x 0.0{0a}
STDOUT: S153{0a}
STDOUT: dApr 1 2013{0a}
STDOUT: :"/"{0a}
STDOUT: {0a}
STDOUT: ### 200{0a}
*** LIST READ
NetRocks::OpBase('/'): count=0 all_total=0
NetRocks::GetFindData '<fish:root@192.168.55.1>/'
CurrentSiteDir: out='/'
Enum '/'
*19 path='/'
HELPER: FISH/ls
STDOUT: Pdrwxr-xr-x 0.0{0a}
STDOUT: S153{0a}
STDOUT: dApr 1 2013{0a}
STDOUT: :"."{0a}
STDOUT: {0a}
STDOUT: Pdrwxr-xr-x 0.0{0a}
STDOUT: S153{0a}
STDOUT: dApr 1 2013{0a}
STDOUT: :".."{0a}
STDOUT: {0a}
STDOUT: Pdrwxr-xr-x 0.0{0a}
STDOUT: S492{0a}
STDOUT: dApr 1 2013{0a}
STDOUT: :"bin"{0a}
STDOUT: {0a}
STDOUT: Pdrwxr-xr-x 0.0{0a}
STDOUT: S0{0a}
STDOUT: dJan 1 1970{0a}
STDOUT: :"dev"{0a}
STDOUT: {0a}
STDOUT: Pdrwxr-xr-x 0.0{0a}
STDOUT: S534{0a}
STDOUT: dApr 1 2013{0a}
STDOUT: :"etc"{0a}
STDOUT: {0a}
STDOUT: Pdrwxr-xr-x 0.0{0a}
STDOUT: S3{0a}
STDOUT: dApr 1 2013{0a}
STDOUT: :"jffs"{0a}
STDOUT: {0a}
STDOUT: Pdrwxr-xr-x 0.0{0a}
STDOUT: S254{0a}
STDOUT: dApr 1 2013{0a}
STDOUT: :"lib"{0a}
STDOUT: {0a}
STDOUT: Pdrwxr-xr-x 0.0{0a}
STDOUT: S3{0a}
STDOUT: dApr 1 2013{0a}
STDOUT: :"mmc"{0a}
STDOUT: {0a}
STDOUT: Plrwxrwxrwx 0.0{0a}
STDOUT: S7{0a}
STDOUT: dApr 1 2013{0a}
STDOUT: :"mnt" -> "tmp/mnt"{0a}
STDOUT: {0a}
STDOUT: Pdrwxr-xr-x 0.0{0a}
STDOUT: S3{0a}
STDOUT: dApr 1 2013{0a}
STDOUT: :"opt"{0a}
STDOUT: {0a}
STDOUT: Pdr-xr-xr-x 0.0{0a}
STDOUT: S0{0a}
STDOUT: dJan 1 1970{0a}
STDOUT: :"proc"{0a}
STDOUT: {0a}
STDOUT: Pdrwxr-xr-x 0.0{0a}
STDOUT: S955{0a}
STDOUT: dApr 1 2013{0a}
STDOUT: :"sbin"{0a}
STDOUT: {0a}
STDOUT: Pdr-xr-xr-x 0.0{0a}
STDOUT: S0{0a}
STDOUT: dJan 1 1970{0a}
STDOUT: :"sys"{0a}
STDOUT: {0a}
STDOUT: Pdrwxrwxrwx 0.0{0a}
STDOUT: S0{0a}
STDOUT: dSep 13 23:39{0a}
STDOUT: :"tmp"{0a}
STDOUT: {0a}
STDOUT: Pdrwxr-xr-x 0.0{0a}
STDOUT: S55{0a}
STDOUT: dApr 1 2013{0a}
STDOUT: :"usr"{0a}
STDOUT: {0a}
STDOUT: Plrwxrwxrwx 0.0{0a}
STDOUT: S7{0a}
STDOUT: dApr 1 2013{0a}
STDOUT: :"var" -> "tmp/var"{0a}
STDOUT: {0a}
STDOUT: Pdrwxr-xr-x 0.0{0a}
STDOUT: S39{0a}
STDOUT: dApr 1 2013{0a}
STDOUT: :"www"{0a}
STDOUT: {0a}
STDOUT: ### 200{0a}
*** LIST READ
*** ProtocolFISH::GetMode
*** ProtocolFISH::GetInformation
Enum '/mnt'
*19 path='/mnt'
HELPER: FISH/ls
STDOUT: ### 200{0a}
ConsoleInput::Enqueue: # 0 12 22 DOWN
ConsoleInput::Enqueue: # 0 12 0 UP