Проблема з відповіддю від @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. $$" буде збивати ваш каталог з мертвими вводами протягом певного часу.
Ви також можете використовувати TCP-сокети, зв'язані з цим localhost, що позбавить вас від захаращення вашої файлової системи мертвими вводами, але навіть з ними вам все одно доведеться виникнути проблеми з вибором (унікального) невикористаного номера порту. Тому все ще не ідеально. ( sshмає код для динамічного розподілу портів, але я не знайшов способу отримати цю інформацію на віддаленому хості.)
Мабуть, найпростішим рішенням для копіювання файлів є використання вбудованої функції спільного доступу до ssh та виконання команд scpабо sfrpкоманд, поки ваш інтерактивний сеанс все ще працює паралельно. Див. Розділ Копіювання файлу до локальної системи за допомогою ssh .
closefrom(STDERR_FILENO + 1)дзвінки під вихідним кодом OpenSSH. Що ви намагаєтесь зробити, що цього вимагає?