Alt dizinimdeki bir dosyayı SSH aracılığıyla uzaktaki bir bilgisayara cp etmek için Unix komutlarını kullanmak mümkün müdür?


17

~/DownloadsKişisel bilgisayarımdaki alt dizinime indirilen bir dizi yazılım dosyası var . Ben de kullanarak bir bilgisayara uzaktan bağlanmak için bash kullanıyorum ssh.

Bu dosyayı sshuzak bilgisayara aktarmak mümkün mü ?


Soru tekil bir dosyaya ( this file) ve birden çok dosyaya ( ) atıfta bulunur a series of software files, en iyi çözüm tek bir dosyanız mı yoksa birden çok dosyanız mı olduğuna bağlıdır.
user2768

Yanıtlar:


42

scpBu amaçla kullanmak isteyebilirsiniz . SSH protokolünü kullanarak dosyaları aktarmak için güvenli bir araçtır.

Örneğin, adlı bir dosya kopyalamak için yourfile.txtgelen ~/Downloadsuzak bilgisayar, kullanımı:

scp ~/Downloads/yourfile.txt your_username@remotehost.edu:/some/remote/directory

Burada daha fazla örnek görebilirsiniz .


5
Sanırım ben rsyncde işe yarayabilir, şimdi düşünüyorum
ShanZhengYang

1
rsync sadece bir ya da el dolu bir dosya için çok karmaşık ...
Paebbels

14
@Paebbels Aksine, scpyukarıdaki ile değiştirin rsyncve gayet iyi çalışmalıdır.
8bittree

Her rsyncşey için, hatta tek dosyalar için kullanmaya eğilimliyim , çünkü basit durumlarda "sadece çalışır" ve diğer durumlarda çok daha verimli olabilir. Ya kullanılıyorsa scpveya rsyncherhangi bir şey değil zaten sıkıştırılmış ve / veya şifrelenmiş üzerine, (üzerinde sıkıştırma seçeneği açmayı unutmayın -Ciçin scp, -zya --compressiçin rsync). Aslında alışkanlık ile açıyorum - işleri yavaşlattığı bir durum bulmanız çok nadirdir (belki de rPi gibi sınırlı CPI gücüne sahip yavaş düşük güçlü bir cihaz kullanıyorsanız).
David Spillett

37

Bunun scpiçin doğru araç açıkça olsa da, herhangi bir nedenle kullanamıyorsanız, yerel makinenizden, örneğin bir dizin yapısını uzak makineye kopyalamak için aşağıdakine benzer bir şey yapabilirsiniz:

tar -c . | ssh <remote> tar -x

Bu işlem taro anki yerel makinede dizin ve yazma tariçin stdouthangi sonra taşınıyor olacak ssho okur tar dosyasını açmak uzak komutu yerine getirecektir komutustdin

Dietrich Epp'in -f -hem oluşturma hem de çıkarma uçlarında varsayılan olma hakkındaki yorumunu yansıtacak şekilde düzenlendi , bu yüzden açıkça belirtmek gerekmiyor.


7
Bunu yapıyorsanız, muhtemelen ana dizininizden başka bir yere ayıklamak -C basediriçin bir argüman eklemek isteyeceksiniz tar.
Dougal

17

Bunu nadir durumlarda yapmak istiyorsanız sshfs, FUSE'yi (Linux, * BSD, Mac OS X) destekleyen bir Unix benzeri kullanıyorsanız uzak dosya sistemini monte etmenizi öneririm . Ana dizininizin altında ~ / remote-server olarak adlandırılan bir dizin oluşturun:

    $ mkdir ~/remote-server

Ardından uzak dosya sistemini ile bağlayın sshfs. "Yourserver.com" yerine uzak makinenizin ana bilgisayar adını ve "uzak dizinin adını" uzaktaki sistemde kullandığınız dizinle değiştirin.

    $ sudo sshfs username@yourserver.com:/name/of/remote/directory ~/remote-server/

Bu yapıldıktan sonra, uzak dizin dosya sisteminizin bir parçasıdır ve üzerinde bulunan tüm normal araçlarınızı kullanabilirsiniz cp:

    $ cp ~/Downloads/your-files ~/remote-server

Henüz sshfsyüklemediyseniz, paket yöneticinizi kullanarak bilgisayarınıza yükleyebilmeniz gerekir ( sshfsveya adlı paketleri arayın fuse-sshfs). Daha fazla bilgi için çevrimiçi bir öğretici okuyabilirsiniz .

Bu arada, uzak sunuculardaki dosyaları yönetmenin en sevdiğim yolu. Normalde bir üretim sunucusunu ve iki geliştirme sunucusunu bu şekilde bağlı tutarım ve normal dosya tarama iş akışımı onlarla birlikte kullanırım.


Ve sonra hangi sshfs seçeneklerinin işinizi en iyi şekilde halletmenize yardımcı olacağını kontrol edin. Örneğin kullanıcı / grup kimliği haritalama ile başlayan -o idmap={none,user,file},gid=<remote_user_group_ID>,allow_otherve -Ckötü bant genişliği ise sıkıştırma için. İyi çalışır çalışmazsa, uzaktaki dosya sistemlerini ssh üzerine hızlı bir şekilde monte etmek için komutlara şahsen takma adlar ekliyorum. @Benjamin_Staton Burada sudo veya root kullanmam, en azından uygun bir kullanıcı / grup eşlemesi olmadan.
tuk0z

9

İlk kez, scp(kopyala ssh) ve arasında gerçek bir fark yoktur rsync.

Sonraki çalıştırmalar, rsync'in zaten varolan dosyaları kopyalamamasından yararlanır.

rsync -avH ~/Downloads  username@remotehost:Downloads
  • -a tüm dosyalar için
  • -v ayrıntılı için
  • -H "sadece sembolik bağlantıları bul ve doğru olanı yap"
  • sonra kaynak ve hedef yollar. Kaynakta joker karakterler kullanabilir veya tüm dizini senkronize edebilirsiniz.

Diğer yararlı bayraklar şunları içerir:

  • --delete hedefte artık kaynakta bulunmayan dosyaları silmek için.
  • --dry-run test için - ile birleştirildiğinde çok kullanışlı --delete.

Bu, sshayarladıysanız, şifreleri olmayan bir giriş yapmak için de tuşları kullanır .

Koşunun sonunda rsync, düz kopyayı tekrar tekrar yapmanın kaç kat daha hızlı olduğunu söyleyeceğiz.


1
-Haslında sabit bağlantılar içindir, kaynak dizin yapısında birden fazla yere bağlandığında aynı içeriğin iki veya daha fazla gönderilmesini durdurur (ancak işlemi büyük dizin yapıları için daha az verimli hale getirebilir). sembolik bağlantılar üzerinde hiçbir etkisi yoktur, ancak -a/ --archivedo tarafından dahil edilen seçeneklerin bazıları semboliklerin işlenme biçimini etkiler.
David Spillett

4

Yukarıdaki cevaplara eklemek için. Bazen uzak yoldan tam olarak emin değilim. Bu durumlarda sftp, önce gerekli konuma gitmek için kullanın, ardından bir dosyayı gerçekten indirmek veya yüklemek için get veya put komutunu kullanın.

Ayrıca, her zaman senkronize edilmiş bir şey tutmak ve hatta uzak makinede bulunan bazı dosyaları yerel olarak yürütmek istiyorsanız, sshfsharika çalışıyor.


-1

SSH ile çok benzer bir şey yapıyorum. Visual Studio için özel bir oluşturma aracı oluşturdum ve temelde VS kodumu hedef bilgisayara kopyalayan ve daha sonra bu hedef bilgisayarda derleyen bir ssh komutunu çalıştırıyorum.

ssh userB @ hostB 'cp /network/path/of/source/file.ext /path/of/final/file.ext; ./runCustomCommand'

Tek tırnak işareti ve noktalı virgül kullanıldığına dikkat edin. Birincisi komutlarınızı ssh aracılığıyla hostB'ye ekler ve ikincisi hostA'dan bir ssh komutunda birden fazla hostB sistem komutunu çalıştırmanıza izin verir.

Bu işi yapmak için, başlangıç ​​makinenizde ssh anahtarları ayarlamanız gerekir, böylece userA @ hostA olabilir ve hostB'ye userB olarak giriş yapabilirsiniz. UserA @ hostA için genel bir ssh anahtarı oluşturma işlemi iyi belgelenmiştir. UserA için hostA üzerinde ortak bir anahtar oluşturmaz ve bu anahtarı hostB'ye userB olarak kopyalarsanız, her seferinde şifrenizi girmeye zorlanırsınız - bu da otomasyonun sevincini bozar.


Aşağı düşmüş olan herkes neden aşağı indirildiklerine dair bir yorum bırakabilir mi? Aşağı oylar bilgilendirici geribildirim olmadan anlamsızdır. OP'nin özel sorusunu doğrudan ilgili bir cevapla ele aldım. Yeni teknoloji tanıtmıyorum ya da alternatif rotalar önermiyorum. Neden? belki OP alternatif rotalar kullanmak istemiyor olabilir.
Andrew
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.