Bir dosyayı ssh ile tekrar yerel sisteme kopyala


257

Bir sisteme SSH ile giriş yaptıysam, bir dosyayı başka bir terminal veya ekran oturumu başlatmadan ve uzak sistemden SSH yapmadan scp veya benzeri bir şey yapmadan ya da benzer bir şey yapmadan yerel sistemime geri kopyalamanın bir yolu var mı? yerel sistem


4
Müşterinizde bir ssh sunucunuz varsa, her zaman deneyebilirsiniz scp file.foo user@myclient.com:file.foo: P
rahmu

4
Elbette, ancak çalıştığım bir şirketin sahibi olduğu bir sunucudan bilgisayarıma erişime izin vermek istemiyorum :) Burada sadece anahtar tabanlı kimlik doğrulamasına sahibim ve özel anahtarımı koyamayacak kadar güvenli olmaz sunucuya kadar!
Naftuli Kay

2
Sorununu anlamıyorum. Yeni bir anahtar çifti oluşturun, ortak kısmı bilgisayarlarınıza yetkili anahtarlara kopyalayın ve transferinizden sonra bu satırı tekrar silin.
Nils

8
Bunu çok yaparım, bu yüzden SSH oturumunun ortasında bir dosyayı kopyalamak istediğimde bunu yapmak verimsiz olurdu. Bir SSH terminal oturumundayken, yerel bilgisayarıma geri dönmenin ve mevcut SSH oturumundan ayrılmak zorunda kalmadan uzaktaki sunucuya bir dosya göndermesini sağlamanın bir yolunu arıyorum.
Naftuli Kay

2
Sorun, ilk ssh girişinin bir acı olabileceği (2fa veya anahtar veya şifrenin ötesindeki diğer zorluklar) olabilir, ssh sunucusunun yapılandırmasını değiştirme ayrıcalığına sahip olamayabiliriz, birden fazla kez anahtar görüşmesi yapmak için hiçbir neden yoktur ve Bir seansımız olduğu zaman, bu seansı birden fazla şey için kullanmak iyi olurdu.
duanev

Yanıtlar:


139

Ana bağlantı

Önceden plan yaparsanız en kolay olanıdır.

İlk defa bir ana bağlantı açın. Daha sonraki bağlantılar için, bağımlı bağlantıları mevcut ana bağlantı üzerinden yönlendirin. Gözlerinde farklı ~/.ssh/config, otomatik olarak gerçekleşmesi bağlantı paylaşımını kurmak:

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

Mevcut bir bağlantıyla aynı (kullanıcı, port, makine) ssh oturumu başlatırsanız, ikinci oturum ilkine tünellenir. İkinci bağlantının kurulması yeni bir kimlik doğrulama gerektirmez ve çok hızlıdır.

Böylece etkin bağlantınız varken, çabucak:

nakliye

Mevcut bir bağlantıda, ters ssh tüneli kurabilirsiniz. Ssh komut satırında, -R 22042:localhost:2222042'nin uzak makinedeki diğer herhangi bir bağlantı noktası numarasından farklı olarak rastgele seçilen bir sayı olduğu bir yere geçerek bir uzaktan iletme oluşturun . Ardından ssh -p 22042 localhostuzaktaki makinede sizi tekrar kaynak makineye bağlar; scp -P 22042 foo localhost:dosyaları kopyalamak için kullanabilirsiniz .

Bunu daha da otomatikleştirebilirsiniz RemoteForward 22042 localhost:22. Bununla ilgili sorun, aynı bilgisayara birden fazla ssh örneği bağlarsanız veya bağlantı noktasını başka biri kullanıyorsa, iletimi alamamanızdır.

Baştan itibaren uzaktan yönlendirmeyi etkinleştirmediyseniz, mevcut bir ssh oturumunda yapabilirsiniz. Yazın Enter ~C Enter -R 22042:localhost:22 Enter. Daha fazla bilgi için kılavuzdaki “Escape karakterleri” bölümüne bakın.

Bu Sunucu Hatası iş parçacığında bazı ilginç bilgiler de var .

Kopyala yapıştır

Dosya küçükse, yazabilir ve terminal çıkışından kopyala-yapıştır yapabilirsiniz. Dosya yazdırılamayan karakterler içeriyorsa, base64 gibi bir kodlama kullanın .

remote.example.net $ base64 <dosyam
 (çıktıyı kopyala)
local.example.net $ base64 -d> dosyam
 (panodaki içeriği yapıştır)
Ctrl +D

Daha kolay, eğer X yönlendirme etkinse, dosyayı uzak makineye kopyalayın ve yerel olarak yapıştırın. Verileri içeri xclipveya dışarı aktarabilirsiniz xsel. Dosya adını ve meta verileri korumak istiyorsanız, bir arşivi kopyalayıp yapıştırın.

remote.example.net$ tar -czf - myfile | xsel

local.example.net$ xsel | tar -xzf -

SSH kullanarak dosya aktarabilirsek, neden insanlar hala SFTP'ye ihtiyaç duyuyor / kullanıyorlar?
Pacerier

3
@Pacerier SFTP, SSH kullanarak dosya aktarmanın bir yoludur.
Gilles

Neden SFTP'siz SSH kullanarak dosya aktarabilirlerse, neden insanlar SFTP'ye ihtiyaç duyuyorlar?
Pacerier

Kopyala-yapıştır yöntemi özellikle zincirleme bağlantılara uygundur (yani
sonuncuya

1
@Pacerier SFTP liste dosyaları gibi bazı ekstra komutlar varsa veya bir uzak dosya vb kaldırmak
rahmu

67

Bir başka (IMO) kolay yol şudur:

# to remote host
cat localfile.conf | ssh user@hostname 'cat -> /tmp/remotefile.conf'

# from remote host
ssh user@hostname 'cat /tmp/remotefile.conf' > /tmp/localfile.conf

Veya GUI benzeri bir şey tercih ederseniz, Midnight Commander'ı deneyin . Shell-Link özelliğini çağırıyorlar . Dağıtımların çoğu, paket sistemlerinde olduğu gibi em mc.


8
Dürüst olmak gerekirse, bunun neden desteklenmediğini anlamıyorum. OP , scp'siz bir çözüm istedi . Bazen, özellikle çok sakatlanmış bir ISS tarafından sağlanan yönlendiricinin içine attığım durumda, sftp yok, scp yok ve ftp bile çok bozuk. Bunu yapabileceğimi biliyordum, sözdizimimin doğru olduğundan emin olmak için buraya geldim.
Auspex

1
Parlak! mckullanımı en hızlı olanıdır.
Namek

2
Aslında, bu çözüm benim durumumda çalışmıyor. Windows’tan Linux’a açılan bir tünelle, bir terminal değil macunla başlarsınız. Bu yöntem tam olarak istediğim şeydi ama kullanamıyorum. Rahatsız.
Benjamin,

1
Bunu engellemememin nedeni, istemci makinenin (bir şirket ağı gibi) paylaşılan bir yönlendiricinin arkasında olması durumunda işe yaramamasıdır. İş bilgisayarında olduğumu ve ev sunucuma bağlandığımı varsayalım. CD'lerin sıkıntılarından geçen boşlukları ve özel karakterleri içeren karmaşık dizinleri kullanarak çalışma bilgisayarıma bir dosyayı nasıl kopyalarım?
Sridhar Sarnobat

1
İkili verilerle iyi çalışıyor. Bunu tgzher zaman dosyalarla yapıyorum :)
Florian Fida

53

SSH, kaçış karakteriyle ( ~varsayılan olarak) birkaç komutu desteklemektedir :

$ ~?
Supported escape sequences:
  ~.  - terminate connection (and any multiplexed sessions)
  ~B  - send a BREAK to the remote system
  ~C  - open a command line
  ~R  - Request rekey (SSH protocol 2 only)
  ~^Z - suspend ssh
  ~#  - list forwarded connections
  ~&  - background ssh (when waiting for connections to terminate)
  ~?  - this message
  ~~  - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)

$ ~C
ssh> help
Commands:
      -L[bind_address:]port:host:hostport    Request local forward
      -R[bind_address:]port:host:hostport    Request remote forward
      -D[bind_address:]port                  Request dynamic forward
      -KR[bind_address:]port                 Cancel remote forward
      !args                                  Execute local command

!argsNe istediğinizi en yakın gibi görünüyor. Komutların çalışması için dosyanızda PermitLocalCommandetkinleştirmiş olmanız gerektiğini unutmayın (bkz. )./etc/ssh_config~Cman ssh_config

Bir ayarlarsanız aynı ssh oturumu yeniden kullanabilir ControlMasterin ssh_config. Eğer bunu yaparsan:

$ ~C
ssh> !scp file user@myserver:

Teknik olarak ssh oturumunu asla terk etmediniz ve yeniden kimlik doğrulamanıza gerek yok. Muhtemelen istediğinden daha karmaşık, ama başka bir kolay yol düşünemiyorum.


Bu hala çalışıyor mu? !argsYardım mesajında bulamadım .
xuhdev

@xuhdev o OpenSSH_7.2p2 üzerinde hala orada argsilk yardım mesajı (içinde değil ~?), fakat ikinci (tek girdiğinde ssh>istemi ile ~C, tek yazabilirsiniz helpat ssh>istemi)
sdaau

Bu iyi bir çözüm gibi görünüyor (denememiş olmama rağmen), ana komut satırı arabelleğini vim tarzı alabileceğinizi bilmiyordum. Uygulamada, kişi yeni bir terminal sekmesi açmayı tercih edebilir, böylece oturuma nasıl geri dönüleceğini unutmazlar (emacs'tan nasıl çıkacağımı asla hatırlayamadığım gibi).
Sridhar Sarnobat

37

Bunların hepsi çok karmaşık yöntemlerdir.
Uzak dosya sistemini yerel makinenize aşağıdakilerle monte edebilirsiniz sshfs:

mkdir -p /mnt/sshfs

root@IS1300:~# sshfs 192.168.1.2:/ /mnt/sshfs
root@IS1300:~# umount /mnt/sshfs

Daha sonra dosyayı nautilus, gnome, konqueror, yunus, bash veya her neyse yapıştırabilirsiniz.


4
Bir anahtar dosyayla bağlantı:sshfs -oIdentityFile=~/.ssh/keyfile.pem user@192.168.1.2:/ /mnt/sshfs/
sshow

15
  • Kullanım SSH-havalesine etkili dosya aktarım kullanım için olan bir SSH yan kanal overloads modifiye SSH-madde.
  • Etkili bir şekilde ssh üzerinde zmodem olan zssh kullanın . Eğer hiç rzsz kullandıysanız bu çok tanıdık gelecektir.
  • Dosya aktarımlarını yürütmek -Riçin tersten ( , uzaktan yerele) veya ileriden ( -L, yerelden uzaklara) bağlantı noktaları, diğer ucunda dinleyen bazı dosya aktarımı arka plan programı olduğunu varsayarak.

Ancak bunlardan hiçbiri gerçekten gerekli değil, IMO. SSH protokolü, tek bir bağlantıda birden fazla kanalı destekler ve OpenSSH istemcisi çoklama işlemini destekler. Varsayalım ControlMasterve ControlPath ayarladınız ( ControlPersistçok yararlıdır),

  # ilk bağlantı
$ ssh uzaktan

  # orijinal ssh'nin açtığı bağlantı ile çarpılır
$ sftp uzaktan

5
zmodem bana yerel BBS'den en son shareware indirmeyi hatırlatıyor. :-)
Stuart Woodward

Xfer way tam olarak aradığım şeydi, ama ssh-xfer yamasının neden OpenSSH yukarı akışına dahil olmadığını biliyor musunuz? Biraz alev?
Ferran Basora

Zssh ipucu için teşekkürler! Konsole'de tmux kullanıyorum ve tmux nedeniyle sunucudan "sz" artık çalışmıyor. Zssh sorunlarımı çözdü!
0xAF

9

Daha da basit bir yaklaşım: Filezilla'yı (veya favori ftp tarayıcınızı) açın, aynı siteye bir ssh bağlantısı açın, dosyayı bulun ve yerel dosya yapınıza sürükleyin. Filezilla'da yeniyseniz, bir dahaki sefere yeniden bağlanmak için "site yöneticisi" özelliğini kullanın.

Evet, bunun birçoğunuz için bariz olduğunu biliyorum (ve tam olarak bu noktada değil);



FileZilla sunucusunun yalnızca Windows olduğuna inanıyorum. Müşteri çapraz platform olsa da
Freedom_Ben

Caja'yı bile kullanabilirsin, sadece aç ssh://SERVER.
temel6,

8

En iyi ve en verimli çözüm olarak bulduğum şey kullanmak xclip-copyfileve kullanmaktır xclip-pastefile.

Sunucuda xclip-copyfilebir veya daha fazla dosyayı kopyalamak için kullanın . Bu dosyalar daha sonra yerel sunucunuzda bulunur. Orada kullanabilirsiniz xclip-pastefile.

Bu, scpyerel bir ssh sunucusunu kullanma veya sahip olma ihtiyacını atlar . Örneğin bunu cygwin ile kullanıyorum. Tek sorun, xclipsizde yoksa, bunun kurulmasını gerektirir . Oh, ve bu da ikili dosyalarla çalışır.


Vay bu benim ters port yönlendirme artı netcat daha iyi bir çözüm olabilir.
Sridhar Sarnobat

3

SecureCRT kullanmamızın birçok nedeninden biri - açık kaynak kodlu yazılımı tercih etmeme rağmen - dosya aktarma işlemlerinin kolaylaşmasıdır. F / OSS dünyasında doğrudan doğrudan bir değişiklik yoktur.

SecureCRT 1990'ların ortalarında saf bir Windows programı olarak başladı, ancak birkaç yıl önce Mac OS X ve Linux'a aktarıldı .

SecureCRT, SSH’nin kullandığı bir sisteme ve sistemden dosya aktarmak için üç ana özelliğe sahiptir:

  • ZModem , YModem , XModem , Kermit ve ASCII - SecureCRT, birkaç bant içi dosya aktarım protokolünü destekleyen eski bir tür terminal emülatörüdür.

    Kullanımı en kolay ZModem'dir. sz file-to-downloadUzak komut satırında olduğu gibi bir şey szyazdığınızda , uzak program SecureCRT'ye hemen varsayılan indirme dizinine indirmeye başlamasını söyleyen bir kaçış dizisi yazar file-to-download.

    Hoş bir dokunuş, indirme dizininin oturum başına özelleştirilebilir olmasıdır. Bunu, ana ofis dosya sunucumuzda site başına dizinler oluşturmak için kullanıyoruz, bu nedenle indirilen dosyaları elle sıralamak zorunda değiliz.

    ( paketin bir szparçası olan "send ZModem" programıdır lrzsz. Çoğu Unixy sistemi için paketlenmiştir. Bazı nedenlerden dolayı, uzaktaki sisteminizde yüklü değilse ve kolayca bir ikili paket yükleyemezseniz, kaynak paketi küçük ve oldukça taşınabilirdir. Bir kereden fazla, soyulmuş bir uzak sisteme bir lrzsz "sharchive" ya da uuencode' tarball göndermek zorunda kaldım, böylece ona ZModem dosyalarını bulabilecektim.)

  • SFTP - SecureCRT, sıkı bir şekilde entegre edilmiş bir temel SFTP uygulamasına sahiptir.

    "Sıkıca bütünleşmiş" ifadesiyle, SFTP menü komutunu veya klavye kısayolunu verdiğinizde, aynı SSH bağlantısı üzerinden uzak siteye bağlı yeni bir sekme açar. Böylece tekrar oturum açmanıza gerek kalmaz ve bağlantı aynı sunucuya ayrı bir SFTP bağlantısı açtıysanız biraz daha hızlı kurulur.

    SFTP özelliğini "temel" olarak niteliyorum, çünkü VanDyke Yazılımında ayrı bir dosya aktarım ürünü olan SecureFX var . Dahili SFTP istemcisinden daha özellikli ve aynı zamanda SecureCRT ile de bütünleşiyor.

    SecureCRT'nin SFTP özelliği, ZModem yapılandırmasından ayrı olan varsayılan uzak ve yerel dizinleri yapılandırmanıza izin verir.

    Bu SFTP özelliği, OpenSSH'nin sftpprogramını taklit eden , Tabkomut tamamlama gibi işlemlerin yapılması dışında basit bir komut satırı arayüzüne sahiptir . Bu nedenle, adlandırılan uzak bir dosyayı almak, somefile.tar.gzbu kadar kolay olabilir get soTabEnter.

  • Sürükle ve bırak - Bir dosyayı terminal penceresine sürükleyip bırakırsanız rz, dosya sizin için otomatik olarak yazılır ve dosyayı göndermeye başlar.

    Alternatif olarak, bir SFTP sekmesini açabilir ve SFTP üzerinden göndermek için bir dosyayı o sekmeye bırakabilirsiniz. Bu nedenle, uzak bir sisteme bir dosya göndermek Alt-P, sürükle , bırak kadar basit olabilir .

    Aktarımların SFTP üzerinden çok daha hızlı gerçekleştiğini bulduk, muhtemelen TCP tabanlı bir protokoldür, bu nedenle modern TCP / IP yığınlarının büyük sürgülü pencerelerinden yararlanır . ZModem, 64 kiB blok büyüklüğünün "büyük" olarak kabul edildiği günlerde tasarlanmıştır. Bu nedenle, bir linkteki potansiyel hızın büyük bir kısmı ZModem'de ıslatılırken, her iki uç da blok transfer onaylarını bekler.

    Sürükle ve bırak modu çalışma hakkında güzel bir şey, ZModem kullanmanın streslerinden birini almasıdır. rzUzaktaki sisteme yazdığınızda , SecureCRT otomatik olarak bir dosya seçici açılır. Uzak taraf zaman aşımına uğramadan önce dosyayı bulmak ve seçmek için yaklaşık bir dakikanız var. Bu, hoş olmayan, zamana karşı yarış ortamı yaratır. Sürükle ve bırak, dosyayı istediğiniz zaman bulmanızı sağlar, daha sonra fareyi tek bir hızlı hareketle aktarmaya başlayın.

    Hala manuel bir yöntem kullanıyoruz, transfere açık bir rzkomutla başlıyoruz . Bunun nedeni, SecureCRT'nin, belirli bir uzak sitenin çalıştığı yazılımın her zaman en son sürümünü içeren dosya sunucusundaki klasörü işaret ettiğimiz bir oturum başına yükleme dizini yapılandırmanıza izin vermesidir. Bu tür transferler için, dosya seçiciyle başlamak için doğru yerde açıldığından, zamana karşı yarış yoktur.


1

"!" Kullan. dosyayı, dosyanın ASCII temsiline dönüştürmek için (örn. ! uuencode myfile.bin >uuencode.dat). O zaman kullan ! cat uuencode.dat >target.dat. Bundan sonra hedef tarafta uudecode kullanın:! uudecode target.dat >myfile.bin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.