Scp yoksa bir dizin oluşturabilir mi?


88

scpDosya yüklemek için kullanmak istiyorum, ancak bazen hedef dizin bulunmayabilir.

Klasörü otomatik olarak oluşturmak mümkün mü? Öyleyse nasıl? Değilse, hangi alternatif yolu deneyebilirim?

Yanıtlar:


71

Bu rsyncyapabilecek birçok şeyden biri .

rsyncSon birkaç yılda yayımlanan bir sürümünü kullanıyorsanız , command temel komut sözdizimi şuna benzer scp: ²

$ rsync -r local-dir remote-machine:path

Bu , uzaktaki makineye kopyalanacak local-sourceve içeriği $HOME/path/local-dir, gerekli olan her türlü dizini oluşturacaktır.

rsyncBurada, bunun sizin durumunuzda çalışıp çalışmayacağını etkileyebilecek bazı kısıtlamalar var. Örneğin, birden çok eksik uzak dizin seviyesi oluşturmaz; uzaktan kumanda üzerinde sadece bir tane eksik seviye oluşturacaktır. Bu rsyncgibi bir komutla komuttan önce bu sorunu kolayca çözebilirsiniz :

$ ssh remote-host 'mkdir -p foo/bar/qux'

$HOME/foo/bar/quxEğer yoksa ağacı yaratacaktır . Zaten varsa, şikayet veya kötü bir şey yapmaz .

rsyncbazen başka şaşırtıcı davranışlar vardır. Temel olarak, neyi kopyalamak istediğinizi çözmesini istiyorsunuz ve tahminleri varsayımlarınızla eşleşmeyebilir. Deneyin ve görün. Beklediğiniz gibi davranmazsa ve nedenini göremiyorsanız, yerel ve uzak dizin kurulumlarınız hakkında daha fazla ayrıntı gönderin ve denediğiniz komutu verin.


Dipnotlar :

  1. Önce rsync2.6.0 (1 Ocak 2004), gerekli -e ssho benzemesi için bayrağı scpo eskimiş için varsayılan çünkü RSH protokolü .

  2. scpve rsyncbazı bayrakları paylaşın, fakat sadece biraz örtüşme var.

  3. Kullanırken SSHtransfer protokolü olarak, rsyncaynı varsayılan kullanır. Bu nedenle, tıpkı scpuzak makinede yerel kullanıcınızla aynı adı taşıyan bir kullanıcının varsayılan olarak olduğu varsayılacaktır.


Mac OSX kullanıyorum, yerel ve uzak taraflara rsync kurmam gerekiyor mu?
AGamePlayer

arandı rsyncgiriş ssh-tuşunu nasıl kullanılacağını bulamadık, belgelerine sayfasını. Giriş yapmak için kullanıcı adı / şifre kullanmak istemiyorum
AGamePlayer 30.05

@AwQiruiGuo: Mac OS X ile birlikte gelir rsync. Ve evet, rsynctıpkı sizin gibi, uzak tarafa da ihtiyacınız var scp. SSH anahtarlarına gelince rsync, aslında varsayılan olarak altında SSH kullanıyor -e ssh, bu nedenle kullanmak üzere ayarlanmış anahtarlarınız varsa scp, onlar da işe yarayacak rsync.
Warren Young

1
@WarrenYoung -rfarketmez. Açıkladığınız senaryo yalnızca bir dizini kopyalıyorsanız ve hedef üst dizinin mevcut olması durumunda çalışır. Bu nedenle, rsync foo/ u@h:~/hedef dizini oluşturacak, fooancak hedef dizini rsync foo/ u@h:~/bar/oluşturmayacak bar. Bu bar/foosadece bar/var ise yaratacak . Her durumda, OP dosya yüklüyor ve hatta çalıştığı durumlarda, yalnızca tüm dizinler için çalışıyor.
terdon

1
Evet, ben de oynuyordum. Bir dosya adı belirtmek de başarısız olmuş gibi görünüyor. Bu yüzden rsync file host:/foo/fileeğer foo/yoksa başarısız olur rsync file host:/foo/, dizini ve içindeki yerleri oluşturur file. Garip. Her neyse, oldukça haklısın ve temel senaryo işe yarıyor, aşağı oyumu geri çekeceğim.
terdon

35

Bir grup dosyayı kopyalıyorsanız, gerçekten değil. Bir dizini ve altındaki tüm içerikleri kopyalıyorsanız, evet. Bu komut verildiğinde:

$ scp -pr /source/directory user@host:the/target/directory

Eğer directorymevcut değil ~/the/targetüzerine host, bu oluşturulacaktır. Bununla birlikte, ~the/targetmevcut değilse, muhtemelen sorunlarınız olacaktır - bu davanın kesin sonuçlarını hatırlamıyorum, ancak amaçlanan scpbaşarısızlığa hazır olun.


1
scp: /home/madmike/test_bin: No such file or directoryHedef dizin eksik kaldığında kurulumumu bozuyor. İstemcide cygwin ve sunucuda RHEL 6.9 kullanımı. Senin kurulumun ne
MadMike

16

Bildiğim kadarıyla, scpkendisi bunu yapamaz, hayır. Ancak, yalnızca sshhedef makineye gidebilir , dizini oluşturup kopyalayabilirsiniz. Gibi bir şey:

ssh user@host "mkdir -p /target/path/" &&
    scp /path/to/source user@host:/target/path/

Tüm dizinleri kopyalıyorsanız, yukarıdakilerin gerekli olmadığına dikkat edin. Örneğin, dizini ~/foouzaktaki ana bilgisayara kopyalamak için -r(özyinelemeli) işaretini kullanabilirsiniz:

scp ~/foo/ user@host:~/

Bu ~/foouzak ana bilgisayarda hedef dizini yaratacaktır . Ancak, ana dizini oluşturamaz. scp ~/foo user@host:~/bar/fooHedef dizin olmadıkça başarısız olur bar. Her durumda, -rtek tek dosyaları kopyalıyorsanız bayrak bir hedef dizin oluşturmanıza yardımcı olmaz.


3

Evet yapabilirsin. Scp'nin man sayfasına göre:

adam scp

.....

-r Dizinleri yinelemeli olarak kopyala. Scp'nin ağaç geçişinde karşılaşılan sym bolik bağlantılarını izlediğine dikkat edin.

....


7
Hedef ana dizini oluşturmayacak. Bir dizini mevcut bir konuma kopyalayabilir. Öyleyse, eğer uzaktan kumanda varsa scp -r foo/ u@h:~/barbunu yaratacak bar/foo, bar/ama yoksa kaldıracaktır.
terdon

1
Başarısız olmayacak. fooİçeriği yeni dizine kopyalar /bar. Tabii ki, OP'nin istediği gibi olmayan isim değiştirildi. İstediğiniz şey hedef makinede oluşturulan yeni bir ağaç yapısıysa, o scpzaman işi yapmazsanız, istediğiniz bir ağaç yapısını ağaçtaki belirli bir daldan çoğaltmak istiyorsanız, o yapı oluşturulur.
YoMismo

6
Evet, ancak bu sadece dosyaları değil dizinleri kopyalarken de işe yarar . scp -r file host:~/bar/yaratmayacak bar/.
terdon

3

btrfsAnlık görüntüleri aktarmadan önce aşağıdaki işlevi kullanıyorum ssh:

check_remote_dir() {
        printf "\ntesting remote directory: '$1' "

        if ssh -p $PORT $ROOT@$REMOTE "[ ! -d $1 ]"; then
                printf "\nCreating: $1 on $ROOT@$REMOTE\n"
                ssh -p $PORT $ROOT@$REMOTE "mkdir -p $1"
        else
                printf "[OK]\n"
        fi
}

Sadece betiğinizdeki fonksiyonu şöyle çağırmalısınız:

check_remote_dir /my/remote/path


Hemen hemen aynı şeyi yapıyorum, ancak şifreyi elle yazmam gerekiyor (güvenlik nedeniyle), bu yüzden en az iki kez yazarak
Stefan Reich

0

Komutu mkdir komutuyla zincirleyebilir ve sonra oluşturduğunuz klasöre başvurabilirsiniz:

mkdir ~/new-folder/ && scp -P 22 <remote/url>:~/new-folder/

3
(1) Soru “otomatik” diyor. Bu otomatik görünmüyor. (2) Terdon'un cevabında sadece önemsiz bir varyasyon olduğu görülüyor .
G-Man

0

Kullanılabilir ssh (scs olmadan) ile sadece scp veya sftp ile sınırlandırıldığında, rsync ile boş bir dizin ağacı kopyalayarak ve ardından dosyaları kopyalayarak dizinler oluşturmak mümkündür.

Ssh-copy-id çalışmadığında ve .ssh dizini olmadığında, genel ssh anahtarını uzaktaki ana bilgisayara bu şekilde koyarım:

rsync -e 'ssh -p22' -av -f"+ */" -f"- *" ~/.ssh backup@1.2.3.4:~/
scp -P22 ~/.ssh/id_rsa.pub backup@1.2.3.4:~/.ssh/authorized_keys

Hedef dosya adı aynı ise, bu komutları ortada bir tane daha eklenmiş filtre ekleyerek bir rsync içinde birleştirmek mümkündür.

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.