Uzak makinede komutu yürütmek için yerel makineden kabuk komut dosyası, ardından yerel makinede devam


10

Sorun şudur: Uzak bir makineden dosya kopyalamak istiyorum.

Uzak sunucuya bağlanmak ve elde edilen konum ile yerel makineden scp kullanmak kez uzak makineye bağlanır, depolanan dosyanın konumunu almak bir kabuk komut dosyası yazmak için bir yol arıyorum dosyayı kopyalayın.

Özellikle, bir komut dosyasından, uzak bir makineye nasıl bağlanacağımı, bu makinede görevler yapacağımı bilmek istiyorum. Bağlantıyı kesin ve yerel olarak yürütmeye devam edin.

Yanıtlar:


15

Çözüm 1:

remote_output="$(ssh user@host "remote command")"
scp "user@$host:$remote_output" /local/path

Bu, uzak makineye bağlanarak, bazı komutları çalıştırarak ve çıkışı yerel makinenizdeki bir değişkene kopyalayarak çalışır. Diyelim ki, dosya yolunu uzaktan yankılayarak, yerel olarak yakalayın.

Çözüm 2:

ssh user@host "determine_path; cat filename" >local_filename

Bu, dosyayı doğrudan uzaktan bulup çıktılayarak ve yerel olarak bir dosyaya yönlendirerek çalışır. Bu scp atlar. Bunun için "cat" dan önceki adımların çıktısının olmaması gerekir (&> / dev / null ile çözebilirsiniz).


1
Tüm sorunu ayrı ssh + scp yerine tek bir bağlantıyla nasıl çözeceğinizi göstermek için +1.
Peter Cordes

Tüm cevaplar yardımcı olur, ancak bu benim sorunum en spesifik olarak ele alıyor
gnsr

20

Bir betiği aşağıdaki biçimde yazabilirsiniz:

command1
command2
...
ssh user@machine command3
...
command4
command5

Sizden command3şifre sormadan yürütülmek için SSH anahtarlarını ayarlamanız gerekir .


2
bunun senkronize olacağına dikkat edilmelidir. Çalışırken ssh user@remote command3, command4başlayamıyorum
aaaaa, Monica'nın

3
@aaaaaa siz öyle yapmadıysanızssh user@machine command3 &
Isaac

3
@Isaac evet, benim açımdan, ya arzu edilebilir davranış olabilir, ancak dikkatli bir karar olmalı
aaaaa Monica

2

Kopyalamak istediğiniz dosyayı nasıl tanımlayacağınız ve bu tanımlamayı yapan uzak makinede çalışacak bir komut dosyası veya komut kümesi yazabildiğiniz veya zaten yazdığınız hakkında bir fikriniz olduğunu varsayalım. .

Ayrıca, bu komutların kopya için kullanılan SSH kullanıcısının ana dizinine göre dosyanın tam yolunu veya dosyanın göreli yolunu standart çıktıda yazdırdığını varsayacağım. Örneğimde, komut dosyasının adı "getfilepath.sh" olsa da, bir kabuk komut dosyası olması gerekmese de, başka bir yürütülebilir dosya veya hatta bir dizi komut olabilir.

# Script to be executed on local machine.

# put any leading local commands here.

FILE=$(ssh user@emote getfilepath.sh);
scp user@remotehost:"$FILE" .

# put any trailing local commands here.

Yukarıdaki kodda, "$ ()" notasyonu bir komutun standart çıktısını kabuk değişkeni olarak yakalamanın bir yoludur. Oldukça standarttır, ancak anlamayan bir kabuk kullanıyorsanız, komutu çoğu ABD klavyesinde 1 tuşun solundaki vurgu işaretleri olan "geri keneler" ile çevreleyebilirsiniz.


0

belki de uzak işi tüm işi yapan zamanlanmış bir Görevi tetiklemek mümkündür.

Bu, kopyalamak istediğiniz dosyaların konumunu ararken uzak makineye bağlı olmanızı engeller.

Bunu yapıyorum:

comand satırı benim durumumda bir batchscript yürüten zamanlanmış bir görevi tetikler.

schtasks /run /s remoteserver /u %user% /p %password% /tn "scheduledtaskname"

Saygılarımla

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.