@Jakuje'nin cevabı ile ilgili sorun: sadece soketlerle çalışıyor , ancak onlarla dosya bekleyen standart UNIX araçlarını kullanamazsınız :
ssh -R/tmp/sock.remote:/tmp/sock.local "$HOST" 'LANG=C cat >/tmp/sock.remote'
bash: /tmp/sock.remote: Böyle bir cihaz veya adres yok
Ayrıca, yerel yuva dosyasının uzak ana bilgisayarda silinmemesi sorunu da vardır; bir sonraki aynı komutu çalıştırdığınızda bir uyarı alırsınız ve soket doğru şekilde yeniden oluşturulmaz. Sen seçeneği verebilir -o StreamLocalBindUnlink=yesüzere ssho eski soket bağlantısını kaldırmak için, ama benim testlerde yeterli değildi; bu seçeneğin çalışması için sizi sshd_configiçerecek şekilde düzenlemeniz gerekir StreamLocalBindUnlink=yes.
Ama kullanabilir socatveya netcatveya destekleyici diğer benzer alet UNIX yerel soket ( netcat-traditionalolduğunu DEĞİL yeterince!) Dosyası transferi için yerel soket yönlendirmesini kullanmak:
# 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'
Etkileşimli komutlar da çalıştırabilirsiniz, bu durumda ssh -tTTY'leri ayırmak için kullanmalısınız.
Bu çözümdeki sorun, UNIX yerel soketlerinin yollarını sabit olarak kodlamanız gerektiğidir: Yerel olarak $$, işlem veya kullanıcı başına geçici bir dizin yapmak için yola dahil edebileceğiniz kadar çok sorun değil, remote-end daha iyi /tmp/benim örnekte yaptığım gibi dünya tarafından yazılabilir dizin kullanmayın . Dizin, sshoturum başlatıldığında zaten var olmalıdır . Ve soket inode, oturum kapatıldıktan sonra bile kalır, bu nedenle "$ HOME / .ssh. $$" gibi bir şey kullanıldığında, dizininiz zaman içinde ölü inode ile karışır.
Ayrıca, bağlanmış TCP soketlerini de kullanabilirsiniz localhost, bu da dosya sistemlerinizi ölü inotlarla karıştırmanızı önler, ancak onlarla birlikte bile (benzersiz) kullanılmayan bir bağlantı noktası numarası seçmeniz gerekir. Yani hala ideal değil. ( sshbağlantı noktalarını dinamik olarak ayırmak için kodu var, ancak uzak ana bilgisayarda bu bilgileri almanın bir yolunu bulamadım.)
Muhtemelen dosyaları kopyalamanın en kolay çözümü, ssh'ın yerleşik bağlantı paylaşım işlevini kullanmak ve etkileşimli oturumunuz paralel olarak çalışırken bir scpveya sfrpkomut yapmaktır . Bkz. Bir dosyayı ssh ile yerel sisteme geri kopyalama .
closefrom(STDERR_FILENO + 1), OpenSSH kaynak kodu altındaki çeşitli çağrılar göz önüne alındığında . Bunu talep eden ne yapmaya çalışıyorsunuz?