Yerel makineden bir komut ile bir proxy üzerinde Scp?


54

Yerel makinem, proxy makinem ve hedef makinem var. local.machine target.machine ile doğrudan temas etmiyor, ancak proxy.machine üzerinden gitmesi gerekiyor.

Target.machine'dan local.machine'e bir dosya kopyalamak istiyorum. Bu local.machine dosyasındaki tek bir komutla yapılabilir mi?

Yanıtlar:


64

Bunun geç bir cevap olduğunu biliyorum ama bunu yapmanın güzel bir yolunu buldum. Temelde Holger Just'un cevabı, ancak kaydedilmiş bir config dosyasında:

Bu ~/.ssh/configdosyayı local.machine dosyasına eklemeniz gerekir , (eğer mevcut değilse dosyayı oluşturabilirsiniz)

Host target.machine
  User          targetuser
  HostName      target.machine
  ProxyCommand  ssh proxyuser@proxy.machine nc %h %p 2> /dev/null

Dosyayı kaydettikten sonra, sadece

ssh target.machine

bağlanmak istediğiniz zaman. Scp ayrıca ssh config dosyasına saygı duyduğundan da çalışacaktır. Öyleyse Nautilus, eğer GNOME kullanıyorsanız ve bir GUI kullanmak istiyorsanız.


5
Sadece hızlı bir not. Ssh için -i komut satırı seçeneğiyle alternatif bir kimlik dosyası kullanıyorsanız, hem ProxyCommand yapılandırması hem de ssh komut satırı için bu seçeneği belirtmeniz gerekir.
BillMan

7
Yardımcı olabilecek 3 şey, 1) Host proxy.machineaynı ~/.ssh/configdosyadaki satırları da göstermiş olsaydınız yardımcı olurdu , 2) Bu komutların iç içe geçip yerleştirilemeyeceğinden bahsedin (yani, istemci, bağlanan proxy ana bilgisayara 2 bağlanan proxy ana bilgisayara 1 bağlanır. ..target) ve 3) ne nc %h %panlama geliyor
puk

Yerel makineden proxy ile hedef makineye nasıl kopyalayabiliriz?
Mulagala

19

Bunu tek bir komutla yapabilirsiniz, ancak proxy makinesinde netcat (nc) kurulu olmalıdır:

ssh -o "ProxyCommand ssh poxyuser@proxy.machine nc -w 1 %h 22" targetuser@target.machine

[EDIT: makinelerin sırasını karıştırdı ...]


İyi deneme, ancak proxy ve oturum açma için kullanıcı adını nereye eklemeliyim?
grm

Jzst, makine isimlerinden önce @ ile. Bunu yansıtmak için cevabımı değiştirdim.
Holger Sadece

19

Şimdi * bunu hiçbir yere gerek olmadan tek gömlek olarak yapabilirsiniznc :

scp -o "ProxyCommand ssh pcreds@proxy.machine -W %h:%p" tcreds@target.machine:file .

açıklama

pcredsve tcredsgerekirse (proxy ve hedef kimlik bilgilerini temsil username, username:passwordvb.)

Bu, dahili bir ağ hattı benzeri yetenek sayesinde, ncara konak için gerekliliği ortadan kaldırarak mümkündür . Kullanarak ssh -W host:portbelirtilen ana bilgisayara ve bağlantı noktasına bir tünel kurar ve onu stdin / stdout'a bağlar ve ardından scptünelin üzerinden geçer.

İçinde %hve %piçinde ProxyCommandbelirttiğiniz hedef ana bilgisayar ve bağlantı noktası ile değiştirilir.

Daha fazla kolaylık için proxy'yi ssh yapılandırmanızda yapılandırabilirsiniz:

Host target.machine
    ProxyCommand ssh pcreds@proxy.machine -W %h:%p

ve ondan sonra sadece yapmak

scp tcreds@target.machine:file .

* OpenSSH 5.4'ten beri - Mart 2010'da yayınlandı


1
Bunun gerçekten işe yaradığı doğrulandı ve proxy makinesinde ortaya çıkan eski NC işlemlerini bırakmadı.
LaXDragon

1
Proxy bağlantı noktasını nerede belirleyebilirim?
18

1
@Marged Şu an burada deneyebilecek bir konumda değilim, ancak proxy bağlantı noktasını belirtmek için herhangi bir yöntemden -p <portnum>önce eklemeniz gerektiğini düşünüyorum-W
CupawnTae

1
-İ seçeneğinin (gerekirse) alıntıların içine girdiğini anlamak biraz zaman aldı . Proxy ssh, varsayılan olarak, doğrudan scp'ye verilen herhangi bir -i seçeneğinde belirtilen aynı özel anahtarı kullanmaz. Sanırım bunu düşündüğün zaman belli oluyor.
Keeely

18

Scp yerine rsync kullanmak sakıncası yoksa, aşağıdaki tek astarı kullanabilirsiniz:

rsync -v --rsh "ssh proxy.machine ssh" target.machine:/remote/file /local/dir/

(Proxy makinesine şifresiz erişmeniz gerekir)


8
$ ssh -f -N -L <localport>:<target.machine:port> user@proxy.machine
$ scp target-user@local.machine:/remote/file -P <localport> .

Tamam, aslında iki komut ...


1
Proxy portunu nasıl belirleyebilirim? Benim durumumda8080
Marged

@Marged -p <portnumber>ssh komutunuza ekleyin
weeheavy

6

Bir astar mı? Başımın üstünden değil. Önce bir proxy oluşturmanız gerekir ve bunu scp ile kendi başınıza yapamazsınız.

Manuel olarak yaparken, tünelim için bir ekran oturumu açıyorum:

screen -S tunnel

Ekran, tünelin arka plan kabuğunda ilerlemesini sağlamak için kullanılır. Tüneli arka planda açık tutmak için istediğiniz tekniği kullanın (@ weeheavy'in cevabı muhtemelen en basitidir). Ekran oturumuna girdiğimde tünelime böyle başlıyorum.

ssh -L 2222:target.machine:22 [user@]proxy.machine

Bunu kırmak için, temel olarak "Yerel makinemde, 2222 numaralı bağlantı noktasını ve localhost'a çarpan herhangi bir bağlantıyı açın: 2222, proxy.machine'den target.machine: 22'ye proxy'liyor.

Ssh bağlantısı ve tünel kurulduktan sonra, "Ca d" ile ekran oturumundan ayrılın. Bu ekran oturumuna geri dönmek için,screen -raAd tunnel

Özgün kabuğunuza döndüğünüzde scp komutunuz şuna benzer:

scp -P 2222 localhost:your/file/on/target.machine local/path

Yerel ana liman 2222 portunun gerçekten sadece hedefe giden bir tünel olduğunu unutmayın.


3

Görünüşe göre scp "-o" seçeneğini destekledi, ssh gibi, ancak bir proxy kullanıcı adı / şifresini nasıl geçireceğimi bilmiyorum:

scp -o "ProxyCommand=nc -X connect -x proxyhost:proxyport %h %p" remote_user@remote_host:remote_path local_path

Eğer alırsanız nc: invalid option -- Xbakınız https://stackoverflow.com/a/23616021/32453


uyuşturucu kardeşim, hemen çalıştı :)
Elouan Keryell-Even

2

Peki ya:

scp -o "ProxyCommand ssh user@myproxyserver.com nc %h %p" your.filename username@yourdestination.yourdomain.com:/whatever_location

veya muhtemelen kullanıcı adı: şifre burada?
rogerdpack 11:15

1

Gibi bir şey deneyebilirsiniz:

ssh user@proxy.machine "ssh user@target.machine 'cat > file'" < file

Fakat eğer proxy.machine şifrenizi size sorması gerekiyorsa işe yaramaz (SSH’nin TTY’de olmadığı, dolayısıyla askpass başarısız olur).

Birden fazla dosyanız varsa, bu şekilde tar kullanabilirsiniz (denenmemiş, genellikle bu şekilde bir netcat kullanırım):

tar cf - file1 file2 folder1/ | ssh user@proxy.machine "ssh user@target.machine 'tar xvf -'"

1

Bir başka basit bir çözüm bir transfer source_file gelen source_host a destination_host üzeri proxy_host :

Üzerinde giriş yapın Proxy_Sunucusu :

ssh login@proxy_host

Proxy sunucusu itibaren aktarmak source_file gelen source_host için destination_host (eğer atlayarak, bir satır olarak bu yazabilirsiniz \, ya da iki satır olarak, aşağıda gösterildiği gibi):

scp login@source_host:/path_to_source_file \
  login@destination_host:/path_to_destination_directory

Bu, source_host'ta proxy_host'taki oturum açma işleminin bir rsa_key kullanmasını gerektirir.


0

Genel anahtarları kullanmanız gerekirse, bunun gibi bir şeye ihtiyacınız olacaktır.

Host target-machine
  User          target-user
  HostName      target.example.com
  IdentityFile  /path/to/file.pem
  ProxyCommand  ssh bastion -W %h:%p

Host bastion
  User         bastion-user
  HostName     bastion.example.com
  IdentityFile /path/to/file.pem

0

Bu yazıyı takip ettim ve benim için işe yarayan bir cevap buldum. (Çünkü yukarıdaki cevaplar benim için işe yaramıyor).

scpBir ara ana bilgisayardan (aka atlama ana bilgisayarı) bir dosyaya nasıl erişilir http://mperdikeas.github.io/networking.html.files/scp-a-file-through-jump-host.html

Ve cevabım aşağıdaki gibidir:

scp -oProxyCommand="ssh -W %h:%p {username}@{proxy_IP}" \
        {source_file} {remote_username}@{remote_IP}:{remote_file_path}

Örnek:

scp -oProxyCommand="ssh -W %h:%p ubuntu@10.60.10.145" \
        archive.gz wise@35.xxx.xxx.xxx:/home/wise/archive.gz

Umarım bu cevap size yardımcı olabilir.

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.