Masalah dengan jawaban dari @jakuje adalah: ini hanya berfungsi dengan soket , tetapi Anda tidak dapat menggunakan alat UNIX standar yang mengharapkan file dengannya:
ssh -R/tmp/sock.remote:/tmp/sock.local "$HOST" 'LANG=C cat >/tmp/sock.remote'
bash: /tmp/sock.remote: Tidak ada perangkat atau alamat tersebut
Juga ada masalah bahwa file soket lokal tidak dihapus pada host jarak jauh; ketika berikutnya Anda menjalankan perintah yang sama, Anda mendapatkan peringatan dan soket tidak dibuat ulang dengan benar. Anda dapat memberikan opsi -o StreamLocalBindUnlink=yes
untuk ssh
memutuskan tautan soket lama itu, tetapi dalam pengujian saya itu tidak cukup; Anda juga harus mengedit sshd_config
agar memuat StreamLocalBindUnlink=yes
agar opsi itu berfungsi.
Tetapi Anda dapat menggunakan socat
atau netcat
atau alat serupa lainnya yang mendukung UNIX soket lokal ( netcat-traditional
yang tidak cukup!) Untuk menggunakan forwarding soket lokal untuk transfer file:
# 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'
Anda juga dapat menjalankan perintah interaktif, dalam hal ini Anda harus menggunakan ssh -t
untuk mengalokasikan TTYs.
Masalah dengan solusi ini adalah Anda harus membuat hard-path path dari UNIX local sockets: Secara lokal ini tidak terlalu menjadi masalah karena Anda dapat memasukkannya $$
di path untuk membuatnya unik per proses atau pengguna direktori sementara, tetapi pada remote-end Anda lebih baik tidak menggunakan direktori yang bisa ditulis dunia /tmp/
seperti yang saya lakukan dalam contoh saya. Direktori juga harus sudah ada saat ssh
sesi dimulai. Dan inode soket akan tetap ada bahkan setelah sesi ditutup, jadi menggunakan sesuatu seperti "$ HOME / .ssh. $$" akan mengacaukan direktori Anda dengan inode yang mati seiring waktu.
Anda juga dapat menggunakan soket TCP terikat localhost
, yang akan menyelamatkan Anda dari mengacaukan sistem file Anda dengan inode mati, tetapi bahkan dengan mereka Anda masih harus masalah untuk memilih nomor port (unik) yang tidak digunakan. Jadi masih belum ideal. ( ssh
memiliki kode untuk mengalokasikan port secara dinamis, tetapi saya tidak menemukan cara untuk mengambil informasi itu pada host jarak jauh.)
Mungkin solusi termudah untuk menyalin file adalah menggunakan fungsi berbagi koneksi built-in ssh dan melakukan scp
atau sfrp
perintah saat sesi interaktif Anda masih berjalan secara paralel. Lihat Menyalin file kembali ke sistem lokal dengan ssh .
closefrom(STDERR_FILENO + 1)
panggilan di bawah kode sumber OpenSSH. Apa yang Anda coba lakukan yang menuntut ini?