scp
Dosya 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?
scp
Dosya 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:
Bu rsync
yapabilecek birçok şeyden biri .
rsync
Son 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-source
ve içeriği $HOME/path/local-dir
, gerekli olan her türlü dizini oluşturacaktır.
rsync
Burada, 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 rsync
gibi bir komutla komuttan önce bu sorunu kolayca çözebilirsiniz :
$ ssh remote-host 'mkdir -p foo/bar/qux'
$HOME/foo/bar/qux
Eğer yoksa ağacı yaratacaktır . Zaten varsa, şikayet veya kötü bir şey yapmaz .
rsync
bazen 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 :
Önce rsync
2.6.0 (1 Ocak 2004), gerekli -e ssh
o benzemesi için bayrağı scp
o eskimiş için varsayılan çünkü RSH protokolü .
scp
ve rsync
bazı bayrakları paylaşın, fakat sadece biraz örtüşme var.
Kullanırken SSH
transfer protokolü olarak, rsync
aynı varsayılan kullanır. Bu nedenle, tıpkı scp
uzak makinede yerel kullanıcınızla aynı adı taşıyan bir kullanıcının varsayılan olarak olduğu varsayılacaktır.
rsync
giriş ssh-tuşunu nasıl kullanılacağını bulamadık, belgelerine sayfasını. Giriş yapmak için kullanıcı adı / şifre kullanmak istemiyorum
rsync
. Ve evet, rsync
tı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
.
-r
farketmez. 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, foo
ancak hedef dizini rsync foo/ u@h:~/bar/
oluşturmayacak bar
. Bu bar/foo
sadece 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.
rsync file host:/foo/file
eğ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.
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 directory
mevcut değil ~/the/target
üzerine host
, bu oluşturulacaktır. Bununla birlikte, ~the/target
mevcut değilse, muhtemelen sorunlarınız olacaktır - bu davanın kesin sonuçlarını hatırlamıyorum, ancak amaçlanan scp
başarısızlığa hazır olun.
scp: /home/madmike/test_bin: No such file or directory
Hedef dizin eksik kaldığında kurulumumu bozuyor. İstemcide cygwin ve sunucuda RHEL 6.9 kullanımı. Senin kurulumun ne
Bildiğim kadarıyla, scp
kendisi bunu yapamaz, hayır. Ancak, yalnızca ssh
hedef 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 ~/foo
uzaktaki ana bilgisayara kopyalamak için -r
(özyinelemeli) işaretini kullanabilirsiniz:
scp ~/foo/ user@host:~/
Bu ~/foo
uzak ana bilgisayarda hedef dizini yaratacaktır . Ancak, ana dizini oluşturamaz. scp ~/foo user@host:~/bar/foo
Hedef dizin olmadıkça başarısız olur bar
. Her durumda, -r
tek tek dosyaları kopyalıyorsanız bayrak bir hedef dizin oluşturmanıza yardımcı olmaz.
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.
....
scp -r foo/ u@h:~/bar
bunu yaratacak bar/foo
, bar/
ama yoksa kaldıracaktır.
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 scp
zaman 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.
scp -r file host:~/bar/
yaratmayacak bar/
.
btrfs
Anlı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
Komutu mkdir komutuyla zincirleyebilir ve sonra oluşturduğunuz klasöre başvurabilirsiniz:
mkdir ~/new-folder/ && scp -P 22 <remote/url>:~/new-folder/
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.