Проблема с ответом @jakuje: он работает только с сокетами , но вы не можете использовать стандартные инструменты UNIX, ожидающие файлы с ними:
ssh -R/tmp/sock.remote:/tmp/sock.local "$HOST" 'LANG=C cat >/tmp/sock.remote'
bash: /tmp/sock.remote: нет такого устройства или адреса
Также есть проблема, что локальный файл сокета не удален на удаленном хосте; когда вы в следующий раз выполните ту же команду, вы получите предупреждение, и сокет не будет воссоздан правильно. Вы можете дать возможность , -o StreamLocalBindUnlink=yes
чтобы ssh
в разкомпоновать , что старый сокет, но в моих тестах не было достаточно; Вы также должны отредактировать вас, sshd_config
чтобы содержать, StreamLocalBindUnlink=yes
чтобы эта опция работала.
Но вы можете использовать socat
или netcat
или любой другой подобный инструмент поддержки UNIX локальных сокетов ( netcat-traditional
это НЕ достаточно!) , Чтобы использовать перенаправление локального сокета для передачи файлов:
# start local process listening on local socket, which receives the data when ssh opens the connections and saves it to a local file
nc -l -N -U /tmp/sock.local >/tmp/file.local &
# connect to remote $HOST and pipe the remote file into the remote socket end
ssh \
-o ExitOnForwardFailure=yes \
-o StreamLocalBindUnlink=yes \
-R /tmp/sock.remote:/tmp/sock.local \
"$HOST" \
'nc -N -U /tmp/sock.remote </tmp/file.remote'
Вы также можете запускать интерактивные команды, в этом случае вы должны использовать ssh -t
для выделения TTY.
Проблема с этим решением состоит в том, что вы должны жестко закодировать пути локальных сокетов UNIX: локально это не такая большая проблема, как вы можете включить $$
в путь, чтобы сделать его уникальным для процесса или пользователя во временном каталоге, но в удаленный конец, вам лучше не использовать каталог для записи в мире, /tmp/
как я делаю в моем примере. Каталог также должен существовать при ssh
запуске сеанса. И inode сокета останется даже после закрытия сеанса, поэтому использование что-то вроде "$ HOME / .ssh. $$" будет загромождать ваш каталог мертвыми inode с течением времени.
Вы также можете использовать привязанные к TCP-сокеты localhost
, что избавит вас от загромождения файловых систем мертвыми inode, но даже с ними вам все равно придется выбирать (уникальный) неиспользуемый номер порта. Так что до сих пор не идеал. ( ssh
имеет код для динамического распределения портов, но я не нашел способа получить эту информацию на удаленном хосте.)
Вероятно, самое простое решение для копирования файлов - использовать встроенную функцию обмена соединениями в ssh и выполнить команду scp
или, sfrp
пока интерактивный сеанс все еще работает параллельно. См. Скопируйте файл обратно в локальную систему с помощью ssh .
closefrom(STDERR_FILENO + 1)
вызовы из исходного кода OpenSSH. Что вы пытаетесь сделать, что требует этого?