@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 ssh
o 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_config
içerecek şekilde düzenlemeniz gerekir StreamLocalBindUnlink=yes
.
Ama kullanabilir socat
veya netcat
veya destekleyici diğer benzer alet UNIX yerel soket ( netcat-traditional
olduğ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 -t
TTY'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, ssh
oturum 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. ( ssh
bağ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 scp
veya sfrp
komut 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?