Проблема з відповіддю від @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. Що ви намагаєтесь зробити, що цього вимагає?