Aktif bir SSH oturumu üzerinden dosya indirin


86

Aktif bir SSH oturumundan dosya indirmek istiyorum. Birçok durumda ben muhtemelen olabilir sadece SFTP'yi, kullanmak scp, rsyncvd ama bu yöntemleri kullanamayan bir şekilde uzak sunucudaki izinleri yükselmiş zamanlar vardır.

Ne demek istediğimi anlamakta zorlanıyorsanız /root/veya den bir şey indirmek istediğinizi düşünün /var/log/auth.log. Kök giriş devre dışı bırakıldı (çünkü biz aptal değiliz). Bu dosyayı nasıl aldın? Daha az korumalı bir yere kopyalayın ve sonra taşıyın? Bu clunky. Uzak yolun karmaşık veya geçici olduğu ya da yol bile olmadığı senaryoları da var çünkü yerel olarak saklanan bir uzak komutun çıktısını istiyorum. Uzaktan saklayın, sonra kopyalayın? Clunk!

Bunların sürümlerini elde etmenin birkaç daha yolsuz yolu var ancak ideal bir dünyada, mevcut SSH oturumunu bir kanal olarak kullanarak uzak sunucudan yerel yazma erişimine benzeyen bir şeyim olacaktı. Gibi bir şey (bu sadece sanatçının izlenimidir):

$oli@remote: cp /root/cheesecake /local/

Ve sadece yerel bölgemde beliriyor cwd. İki yönlü erişim kötü bir şey olmaz.


Bu soruyu sorduğumdan bu yana sekiz yıl geçti ve gerçekten çok fazla aksaklık görmüştük, fakat hala arada sırada mücadele ettiğim bir sorun olmaya devam ediyor.

Soruyu çok daha idealist bir şeye yeniden çevirdim. Tam olarak şu anda mükemmel bir cevap olamayabileceğini biliyorum. İdealime yönelik tüm geçmiş ve gelecekteki çabalarım takdir edilmektedir.


1
İlginç soru! İnsanların yapması gerekenler hakkındaki fikirlerini, kullandıkları araçlarla nasıl şekillendirdiklerini gerçekten gösteriyor. zsshMuhtemelen hatırladığınız zmodem benzeri iş akışına en yakın olanıdır.
poolie

1
8 cevaptan sonra bile, bunu yapmanın hiçbir yolu olmadığına gerçekten şaşırdım
endolith,

Yanıtlar:


34

Evrende mevcut olan ve bu nedenle mevcut olan zssh'ı kontrol etmek isteyebilirsiniz.

sudo apt-get install zssh

Ubuntu sunucunuzda ve istemcinizde ihtiyacınız var, ancak temelde zssh ile oturum açtığınızda, sadece 'ctrl- @' tuşlarına basarsınız ve bu, dosyalarınızı aşağıdan boruya geri göndermenizi sağlayan "Dosya aktarım modunu" getirir. İstemci makinesini kullanın veya bunları istemciden sunucuya yükleyin.

Ancak, scp için yeniden kimlik doğrulamanız veya yeni bir pencere açmanız gerekmez.

Eğer ssh anahtarlarını ve bir ssh aracısını kullanıyorsanız, kolayca yapabilirsiniz:

[enter]~[ctrl]-Z

Hangi ssh arka plan ve sonra sadece scp $!:/whatever/whatever .'

Dosya aktarıldıktan sonra fgssh'yi geri almak için.

Eğer ssh tuşlarını kullanmıyorsanız, en son OpenSSh sürümlerine eklenen "ControlMaster" ve "ControlPath" seçeneklerini kullanabilirsiniz, ancak bu zorlaşır, adam ssh_config'e bakın


24

Masaüstünüzde bir ssh sunucusu çalıştırdığınızı varsayalım (bunun etrafında yollar var, ancak hepsinin karmaşıklık ve muhtemelen güvenlik sorunları olduğunu düşünüyorum), ters ssh tüneli kurabilirsiniz. Bkz kolayca yerel sisteme dosyayı kopyalamak SSH. üzerinden en unix.SE .

  • Tip Enter ~C Enter -R 22042:localhost:22 Entermasaüstünüze sunucudan ters port yönlendirme oluşturmak için (22.042 kullanımda değil 1024 ile 65534 arasında herhangi bir bağlantı noktası numarası olabilir).
  • Ardından scp -P 22042 foo localhost:dosyayı foosunucudaki geçerli dizindeki masaüstündeki evinize kopyalayın .
  • Şimdi, Enter ~ Ctrl+ yazarak dosyayı masaüstündeki geçerli dizine taşıyın Z mv ~/foo . Enter fg Enter.

Ssh kaçış dizileri ile başlar ~; tilde yalnızca yeni bir satırdan sonra tanınır. ~ Ctrl+Zssh'ı arka plana koyar. ~Cbir yönlendirme oluşturabileceğiniz veya kaldırabileceğiniz bir komut satırı girer.


1
2 kat şifreleme ve sıkıştırma kullanmak biraz overkill, bu yüzden "back link" için rsh veya ftp kullanılmasını önerdim.
Ocak

2
@JanC: Daha fazla kurulum gerektirir: bir rsh veya ftp sunucusu kurmanız ve yapılandırmasının güvenli olduğundan emin olmanız gerekir. Şifrelemenin ek yükü bir netbook'ta bile minimum seviyede.
Gilles

Bir ssh-server da varsayılan olarak kurulmaz. ;)
Ocak

@JanC: ssh'ın diğer bir avantajı, aracı yönlendirmeyi etkinleştirdiyseniz, kopyayı yapmak için bir şifre girmeniz gerekmeyecek olmasıdır. Bilgisayar mikro veriminin üzerinde iş akışı verimliliği.
Gilles

Tabii ki (bazı) diğer hizmetlerle de böyle bir şey yapabilirsiniz. Her durumda, tümü geri tünelli bir bağlantı ve ekstra bir arka plan programı oluşturmayı da içeren çok sayıda benzer çözüm var ...;)
JanC

10

Bunu standart ssh ile yapmanın bir yolunu buldum. Geçerli ssh bağlantısını çoğaltan, çalışma dizini uzaktaki makinede bulan ve belirlediğiniz dosyayı yerel makineye kopyalayan bir betiktir. Ssh config'inizde çok küçük 2 script (1 uzaktan kumanda, 1 yerel) ve 2 satır gerekiyor. Adımlar aşağıdaki gibidir:

  1. Bu 2 satırı size ekleyin ~/.ssh/config:

    ControlMaster auto
    ControlPath ~/.ssh/socket-%r@%h:%p
    

    Şimdi machineX open ile ssh bağlantınız varsa, başka bir tane açmak için şifrelere ihtiyacınız olmaz.

  2. Uzaktaki makinede 1 satırlık bir komut dosyası oluşturun. ~/.grabCat.sh

    \#!/bin/bash<br>
    cat "$(pwdx $(pgrep -u $(whoami) bash) | grep -o '/.*' | tail -n 1)"/$1
    
  3. Yerel makinede ~ / .grab.sh adlı bir komut dosyası oluşturun.

    \#!/bin/bash
    [ -n "$3" ] && dir="$3" || dir="."
    ssh "$1" ".grabCat.sh $2" > "$dir/$2"
    
  4. ve grab.sh için bir takma ad ( ~/.bashrcveya her yerde) yapın:

    alias grab=~/.grab.sh
    

Hepsi bu kadar. Şimdi giriş yaptıysanız machineX:/some/directory, yeni bir terminal açmanız yeterlidir.

grab machineX filename

Bu, dosyayı yerel makinedeki geçerli çalışma dizininize yerleştirir. "Kepçe" için üçüncü bir argüman olarak farklı bir konum belirleyebilirsiniz.

Not: Açıkçası, her iki komutun da "çalıştırılabilir" olması, yani chmod u+x filename.


İlginç, bunun nasıl çalıştığını açıklayabilir misiniz? Bunları dosyaları almanın yanı sıra "koyma" özelliğini desteklemek için genişletebilir misiniz?
Peter Gibson

5

İstemci makinenize (oturduğunuz makine) makineA ve şu anda SSH'lediğiniz makineye makine B MakineA deniyorsa, yerel makinenizde SSHD çalışıyor ve bağlantı noktası 22 açık olmalıdır. Sonra:

scp myfile machineA:

Kopya myfileMachineA benim MachineA ana dizine MachineB üzerinde. Bu, kullanıcı kimliğinin / şifrenin aynı olduğunu varsayar.

scp myfile machineA:/newdir/newname

myfileBir MachineB'yi /newdir/newnamemachineA'ya kopyalar . Bu, kullanıcı kimliğinin / şifrenin aynı olduğunu varsayar.

scp MachineA:/path/to/my/otherfile . 

otherfileMachineA dizinindeki MachineA dizinimden bir kopyasını alır ve MachineB makinesi üzerindeki geçerli çalışma dizinime koyar (standart UNIX biçiminde "nokta" (.) Karakteri ile gösterilir). Bu, kullanıcı kimliğinin / şifrenin aynı olduğunu varsayar.

Kullanıcı kimliği / şifre aynı değilse, aşağıdakileri kullanın:

scp myfile user@MachineA: dosya almak için.

scp user@MachineA:/path/to/my/otherfile . dosya koymak

SCP ile ilgili notlar:

Aynı cpkomutta olduğu gibi, scporijinal dosyanın izin ayarlarını kopyaya yaymak için bir -p seçeneğine (aksi takdirde kopya yeni dosyalar için normal ayarlarla yapılır) ve bir dizin ağacının tamamını bir ile kopyalamak için bir -r seçeneğine sahiptir. komut.

scpİki makine arasında tamamen şeffaf şifreli bir veri kanalı oluşturur, böylece ikili veriler (görüntüler veya çalıştırılabilir programlar gibi) doğru şekilde korunur. Bu, aynı zamanda scp, "ascii" modunda ftp ile yapılabileceği gibi, farklı işletim sistemleri arasında otomatik satır sonu sonlandırma dönüşümünü gerçekleştiremediği anlamına gelir . Hepsi aynı hat sonu kuralını kullanan Unix sistemleri arasında kopyalama yaparken bu bir problem olmayacak.


2

Sunucuya ssh ile erişirseniz sftp ile de bağlanabilirsiniz. Filezilla istemcisini (GUI) el altında tutun ve bulunduğunuz yolu yapıştırın

görüntü tanımını buraya girin


2
Bu, FileZilla ile bir SSH sunucusuna nasıl bağlanılacağı da dahil olmak üzere daha ayrıntılı olarak fayda sağlayacaktır (açık değildir). Ekran görüntüleri ayrıca açıklayıcı metne ek olarak yardımcı olabilir .
Eliah Kagan

2

Dosyanız yeterince küçükse, onu base64 ile kodlayabilir ve ardından yerel olarak kodunu çözebilirsiniz:

remote.example.net $ base64 <dosyam
 (çıktıyı kopyala)
local.example.net $ base64 -d> dosyam
 (çıktıyı kopyala)
Ctrl +D

Bunu nereden bulduğumu (ve test ettiğimi) orijinal cevap: https://unix.stackexchange.com/a/2869/194134


Bunun ne alakası var? Dosyaları txfr ile scp vb. İle kodlamanıza gerek yoktur.
HörmannHH

1

Aktif SSH bağlantısı üzerinden değil, fakat scp , ssh ile aynı mekanizmaları ve izinleri kullanarak dosyaları kopyalar.


4
Scp'nin farkındayım ama bu çok ayrık bir iş akışı. Belirli bir uzak dizinde çalışıyorsam, uzak yolu bulmam, bağlantıyı kesmem (veya başka bir kabuğu çıkarmam), yolları yazmayı ve sonra yeniden bağlanmamı istiyorum. Yazmaya benzer bir şey arıyorum get fileve sihirli bir şekilde yerel makineme geri dönüyor. Bunu SSH üzerinden tünelli bir servis aracılığıyla yapmak zorundaysa, öyleyse öyle olsun .. Ama oturuma bağlı olmalıdır.
Oli

Ayrıca sftp tarafından değiştirildi (cevabımı görün)
Olivier Lalonde

@Oli - İşlemin her iki ucu da * nix kutuları olduğundan, muhtemelen ikisi de sshdçalışıyordur ve bu nedenle scpsunucuyu komut istemcisine geri göndermek için sunucunun komut satırında kullanmanız gerekir . Etrafta dolaşacak çok fazla sihir var; bazen hala düğmelere basmamız gerekiyor. FileZilla çözümü de kullanışlıdır.
sıfır bant genişliği

1

Bu, varsayılan bir ssh oturumu ile mümkün değildir, ancak yerel sisteminizde basit bir ftp veya rsh sunucusu gibi bir şey başlatan ve masaüstünüze bir tünel kurmak için gerekli seçeneklerle ssh çalıştıran ssh yerine bir komut dosyası kullanabilirsiniz. Bu sunucuya bağlanmak için


Ya da sadece scp / rsync olabilir ...
HörmannHH

1

konsole Uzak bir oturumda (veya Ctrl-Alt-U) iken "Edit-> ZModem Upload" menüsünden bu yeteneğe sahip.

Lütfen dikkat: önce paket lrzszkurulmalıdır. Benim için sadece ASCII dosyalarını yüklemek için çalışıyor gibi görünüyor.


0

Masaüstünden bağlandığınız için ikinci bir terminal açabilirsiniz.

Bu sık sık yaptığım şey:

  • ssh oturumunun çalıştığı ilk uçbirimden birini ya realpath myfileda readlink -f myfile(daha eski Ubuntu sürümleri önceden yüklenmez realpath) kullanarak ya da almam gereken dosyanın tam yolunu alıyorum ve kopyalayacağım.
  • ikinci terminalden kullandığım scpya sftpda dosyayı almak için önce aldığım tam yolu yapıştırarak. Örneğin:scp user@host:/etc/some/file ./

Oldukça basit, ama hatırlaması da kolay ve çalışması için fazladan bir pakete ihtiyaç duymuyor.

ilk terminalden tam yolu alın ve ardından ikinci terminale yapıştırın.


"Kök dosya almaya çalışırken ve doğrudan kök dizinine giriş yapmanıza izin verilmiyor" sorunu çözülmedi.
Oli

0

Şaşırtıcı bir şekilde, burada eski güzel Midnight Komutanı'ndan bahsetmiyorum . Aklıma, muhtemelen güç yetenekli kabuk için en evrensel ve kullanışlı dosya yöneticisi, bu durumda da SSH, FTP, SFTP ile bağlanmanıza olanak tanıyan "olması gereken" araçlardan biri. İkinci panelde başka herhangi bir (yerel) dosya sisteminizi açabilir ve bu sayede dosyalarla özgürce çalışabilirsiniz.

Tek ihtiyacınız olan: apt-get install mc (evrenden)

Bundan sonra, mc komutunu çalıştırın, sol veya sağ panel menüsünü açın, kabuk bağlantısını seçin, username @ remote-ip, parolanızı girin - aslında, işte bu. F5, F6 ile hareket ettirin ve aşağıdaki düğmelere göre devam edin. Eski MS kullanıcıları için: NC'deki DOS'ta olduğu gibi


-2

Bunun üzerine düşünmek yoldaydı millet. Ben de bütün derin, karanlık ve karmaşık cevapları arıyordum. Anlaşılan bu hakkı doğrudan Dolphin'den yapabileceksiniz. Balık: // kullanıcıadı @ sunucu: port


Ben alamadım
Pierre.Vriens

Kullanım davamı anladığını sanmıyorum. Etkin bir SSH komut satırı oturumundayım ve yerel bilgisayarıma [potansiyel olarak ayrıcalıklı, yani SFTP üzerinden kullanılamaz] konumundan bir dosya göndermek istiyorum. Kendi halinde bir dosya bile olmayabilir, komut çıktısı olabilir. Ara dosyalar oluşturmadan ve yeni SFTP / SCP / etc oturumları başlatmadan geri aktarmanın bir yolunu arıyorum.
Oli
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.