Korumalı dosyalar bir satırdaki sunucular arasında kopyalanıyor mu?


13

squid.confBir sunucudan diğerine kopyalamak istiyorum .

  • Sunucular birbirleriyle konuşmuyorlar. İş istasyonumdan geçmek istiyorum.
  • Her iki sunucu da dosyaya sahiptir, bu nedenle hedefin üzerine yazılır.
  • Dosyaların 600izni vardır ve sahip oldukları kök dizinidir.
  • ssh üzerinden root girişi devre dışı ( PermitRootLogin no).
  • Bir kurulum kılavuzunun parçası olacağından, mümkünse tek bir satırda yapmak istiyorum.

Yapmayı biliyorum

ssh source 'tar czpf - -C /etc/squid/ squid.conf' | \
    ssh target 'tar xzpf - -C /etc/squid/'

dosyaları sunucular arasında kopyalamak ve izinleri korumak için. Ancak, bu durumda "İzin reddedildi" alırım.

Bunu yapabileceğimi de biliyorum:

ssh -t source 'sudo cat /etc/squid/squid.conf'

Bu şekilde, -tsudo dosyasının içeriğini çıkarmadan önce yönetici şifresi istemesine izin verir.

Sorun, nasıl bu teknikleri her sunucuda sudo şifresi soracak bir şey içine birleştirmek bilmiyorum ve dosyayı hedefine aktarmak. Mümkün mü?

GÜNCELLEME : İşte bulabileceğim en iyi şey:

ssh -t source 'sudo tar czf /tmp/squid.tgz -C /etc/squid squid.conf' && \
ssh source 'cat /tmp/squid.tgz' | \
    ssh target 'cat >/tmp/squid.tgz' && \
ssh -t source 'sudo rm /tmp/squid.tgz' && \
ssh -t target \
    'sudo tar xzf /tmp/squid.tgz -C /etc/squid && sudo rm /tmp/squid.tgz'

Bunu tek astar olarak adlandırmak bir streç gibi görünüyor. Sanırım kurulum kılavuzundaki ayrı adımlara ayırıyorum.


Yanıtlar:


11

Ssh ile ssh zincirlemek sudo ile ssh zincirinden daha kolaydır. Yani ssh sunucu yapılandırmasını değiştirmek tamam, her sunucunun kökü için ssh açılmasını öneririm, ama sadece localhost'tan. Bunu bir Matchcümle ile yapabilirsiniz sshd_config:

PermitRootLogin no
Match Host localhost
    PermitRootLogin yes

Ardından, uzak kullanıcıdan yerel kullanıcıya ve yerel kullanıcıdan köke kadar anahtar tabanlı bir kimlik doğrulama zinciri ayarlayabilirsiniz. Hala bir kimlik doğrulama iziniz var, böylece günlükleriniz size kök olarak kimin giriş yaptığını söyler ve kimlik doğrulama adımları sudo'nun dahil olduğu ile aynıdır.

Bir sunucuya root olarak bağlanmak için aşağıdaki şekilde bir takma ad tanımlayın ~/.ssh/config:

Host server-root
HostName server.example.com
User root
ProxyCommand "ssh server.example.com nc %h %p"

Kullanmakta ısrar ediyorsanız sudo, sudoterminalden okumak için ısrarcı olduğu için (hesabınız için bir bilet olsa bile) ayrı komutlara ihtiyacınız olduğuna inanıyorum ¹ ve normal dosya kopyalama yöntemlerinden hiçbiri (scp, sftp, rsync) uzak terminal ile etkileşim desteği.

Ssh ve sudo ile yapıştırarak, önerilen komutlarınız basitleştirilebilir. Her iki tarafta, sudo'dan tekrar şifre istemeyecek şekilde ayarladıysanız, şifre gereksinimini karşılamak için bir kez ve dosyayı kopyalamak için başka bir kez çalıştırabilirsiniz. (Parola istemi engel olduğu için dosyayı doğrudan doğrudan kopyalayamazsınız.)

ssh -t source 'sudo true'
ssh -t target 'sudo true'
ssh -t source 'sudo cat squid.conf' |
ssh -t target 'sudo tee /etc/squid/squid.conf'

¹ yoksa NOPASSWD, ama o zaman bunu sormazdın.


İlk çözüm benim için iyi çalıştı ama ikinci satır olmalı Match host localhost.
cduck

4

Bir sudodahaki sefere şifre istemeyecek şekilde ayarlayabilirsiniz :

Kaynakta:

user    ALL=NOPASSWD:/bin/cat

Hedefte:

user    ALL=NOPASSWD:/usr/bin/tee

Ve yur makinede yapın:

ssh source 'sudo cat /test' | ssh target 'sudo tee /test'

Ama kukla gibi bir şey kullanmanızı tavsiye ederim . Çok daha iyi ve daha kolay yapılandırma dosyaları dağıtım ile sorununuzu çözer.

PS. Bu arada, sudokullanıcıdan şifre sormak üzere ayarladıysanız [sudo] password for user, hedef dosyada bulunan dize görünecektir.


Kukla önermek için +1, ancak çözümünüz güvensiz görünüyor. Kök olarak oturum açmaya izin verebilirim.
itsadok

2

Ssh kullanmak yerine scp kullanarak dosyayı sunucular arasında aktarabilirsiniz.

Hedef sunucuda oturum açın:

Dosyayı kopyalamak istediğiniz hedef dizine geçin.

#scp -r -p -P 22 root@source-ipaddress:/source-path-file-to-copy .

r - özyinelemeli p - Orijinal dosyadaki değişiklik sürelerini, erişim sürelerini ve modları korur


Bu, root olarak giriş yapabileceğimi varsayıyor, ki yapamıyorum. Soru güncelleniyor.
itsadok

2

Ssh yapılandırmasını değiştirmeden, sunucu2'ye ssh bağlantısıyla iki ssh tüneli host-> server1 ve server2-> host oluşturabilirsiniz. Bu iki tüneli ana makineye bağlayın (aynı bağlantı noktası). Ve sunucu1'deki bağlı tünellerden veri almak ve bunları sunucu2'ye kaydetmek için sunucu2'de sudo'yu çalıştırın.

ssh -L60000:${source}:22 -R60000:localhost:60000 -t ${target} 'sudo bash -c "ssh -p 60000 '$(whoami)'@localhost \"cd /path/to/dir; tar -czf - files\"|tar -C/path/to/target -xzf -"'

Fikir: 1- 60000 numaralı bağlantı noktasında makinenizden kaynak makineye yerel bir tünel oluşturmak

ssh -L60000:${source}:22

1b- Makinenize geri dönmek için bir uzak tünel oluşturun

-R60000:localhost:60000

2- Hedef makineye bağlanın

-t ${target}

3- Yazmak için hedef makinede kök olarak çalıştırın

'sudo bash -c "..."'

4- Kaynak makineye tünelden bağlanın. whoami ve localhost üzerinde $ {target} makinesindeki localhost anlamına gelir.

ssh -p 60000 '$(whoami)'@localhost

5- Uzaktaki dosya (lar) ı paketleyin ve stdout'a sıkıştırılmış olarak gönderin

cd /path/to/dir; tar -czf - file

6- paketi stdout aracılığıyla alın ve / path / to / target dizinindeki dosyaları açın

|tar -C/path/to/target -xzf -

Not: En fazla 3 sshkey onayı ve 3 şifre talebi alabilirsiniz. Ancak dosyalar kopyalanacaktı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.