sudo ile uzak sunucuya scp


63

Sunucu A'da bir dosya var (ki bir NAT'in arkasında, doğrudan adreslenebilir değil) Dosyanın kök ile sınırlı bir dizinde B sunucusuna kopyalanması gerekiyor. B sunucusunda sudo ayrıcalıklarına sahip bir hesabım var. Scp komutunun sözdizimi nedir?



Eski soruyu, bunun bir kopyası olarak kapattım, çünkü soru soran bu soruya tekrar sahip olmadı.
quack quixote

Ben cevap vermiş başka bir gönderme Eğer scp doğrudan sizin için sudo yapmak nasıl özelleştirebileceğini. Bu, WinSCP'nin yaptıklarına benzer.
YoYo

Yanıtlar:


56

Öncelikle dosyayı sudo olmadan yazma erişimine sahip bir yere kopyalamanız gerekir.

scp yourfile serverb:

Sonra sudo kullanarak dosyayı taşıyın

ssh serverb sudo mv yourfile /path/to/the/destination

Yazılabilir bir yeriniz yoksa, kullanıcınız için yazma izniyle geçici bir dizin oluşturun.

ssh serverb sudo mkdir tempdir && sudo chmod 777 tempdir
scp yourfile serverb:tempdir
ssh serverb mv tempdir/yourfile /path/to/the/destination

7
/ tmp, tüm kullanıcıların erişebildiği geçici dosyaları yazmak için iyi bir yerdir.
Doug Harris

3
@Doug: / tmp'nin RAM veya giriş / montaj noktasında olabileceğini ve büyük dosyaları barındıracak kadar büyük olmadıklarını unutmayın.
Ravachol

2
Neyi başarmaya çalışıyorsanız yapın chmod 777, genellikle bunu yapmanın yanlış yoludur. Başka biri giriş yaptıysa ve bu kodu çalıştırmak üzere olduğunuzu bilseydi ne olacağını düşünün.
üçlü

1
ssh sudobenim için işe yaramıyor - "mevcut olmayan bir program ya da bir bilgi isteme programı belirtilmemiş" diye şikayet ediyor
Ross Presser

46

SCP ile iki adımda yapmanız gerekir, ancak rsync ile aşağıdaki gibi yapabilirsiniz:

rsync --rsync-path="sudo rsync" <LOCALFILE> USER@SERVER2:/root

Not: Bu NOPASSWDsudo yapılandırması gerektirir . Sudo şifresini girmeniz gerekiyorsa, iki aşamalı yol gereklidir.

Dizini kopyalamak için -rparametre eklemeniz gerekir . Ve -vayrıntılı çıktı için.


Yukarıdaki yöntemi kimlik bilgileriyle kullanmak için, bunları ~/.ssh/configdosyanıza eklemeniz gerekir.

Host SERVER2
  HostName server2.example.colm
  User USER
  #IdentityFile ~/.ssh/custom_key.pem

5
Bu, bunu yapmanın en basit yoludur.
Matt White,

Hata sudo: sorry, you must have a tty to run sudoile sabit -e "ssh -tt".
mj41 13

@ mj41 Ile -e "ssh -tt", anladım protocol version mismatch -- is your shell clean?. Bunu düzeltmek için herhangi bir ipucu var mı?
balta.

19

Bu soruna geçici bir çözüm bulmak için ssh ve tar kullanabilirsiniz:

ssh -t host 'sudo -v'
ssh -C host 'cd /; sudo tar cf - path/to/file/or/dir' | tar xpsf - --preserve

Bu, önce sudo zaman damgasınızı günceller (gerekirse bir tty ( ssh -t) gerektiren bir parola sorar ), sonra da bir tarball oluşturmak için yerel olarak sudo kullanır.

RedHat 5'teki "tar", "xpsf -" komutundan sonra gelen "--preserve" seçeneklerini gerektirir.


Sadece bir not: Eğer alırsanız tar: Invalid replacement string, kaldırmak -sgibi görünüyor ( szaten için neye ihtiyacınız olduğundan emin değilim ). Çok teşekkürler; bu harika.
Özyinelemeyle İronik

Bunun tty_ticketsdevre dışı bırakılması gerekir, doğru mu?
Jacob Budin

@JocobBudin evet.
blueyed

4

Örneğin sftp sudo komutuyla kullanabilirsiniz:

sftp -s 'sudo -u REMOTE_SUDO_USER /usr/libexec/openssh/sftp-server' REMOTE_USER@HOST

Bu ve rsync yöntemleri muhtemelen tek adımda yapmanın en doğrudan yoludur. Karıncadaki scp görevinin bunu desteklememesi talihsiz bir durumdur. Sftp kullanacak şekilde ayarlayabilirsiniz, ancak uzak alt programı değiştiremezsiniz. Alt programın sunucunun türüne bağlı olarak farklı olacağını unutmayın (solaris farklı olabilir).
Yoo

0

Her seferinde sudo için şifre yazmanız gerekirse, dosyayı bir dosyaya kaydedebilirsiniz:

echo "Enter password: "; read -s password; echo $password > password_file

ve sonra kaynak dosya ile birlikte gönderin.

cat password_file source_file | ssh remote_host 'sudo -S sponge target_file'

Daha fazla üyeniz yoksa tee, yerine kullanabilirsiniz sponge.


0

Öncelikle dosyayı sudo olmadan yazma erişimine sahip bir yere kopyalamanız gerekir, Aşağıdaki iki adımı yapabilirsiniz.

Aşama 1: scp filename newserver

Adım 2: ssh newserver sudo mv filename /path/to/the/destination

Daha fazla bilgi için scp eğitimini okuyun


-1
current server $ sudo scp username@server:source/path/filename /tmp/

Belirli bir dosyayı kaynaktan / tmp / o anki sunucuda kopyalayacaktır


Sudo yerel olarak çalıştırılacak ve size uzaktan hiçbir yüksek ayrıcalık tanımayacak.
YoYo

Bu sadece işe yaramaz, @Yoyo'nun dediği gibi.
Mani

scp muhtemelen bağlanmayacak, çünkü kökün anahtarını
okuyacak
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.