Kök erişimli dosyaları scp ile nasıl kopyalarım?

134

SSH kullanarak bağlandığım bir Ubuntu sunucum var.

Makinemdeki dosyaları sunucuda /var/www/ dosyasına yüklemem gerekiyor, /var/www/ dosyasındaki dosyalar root 'e ait.

PuTTY'yi kullanarak oturum açtıktan sonra, sudo su dosyasındaki dosyaları değiştirebilmek için önce /var/www/ ve parolam yazmalıyım.

Ancak, dosyaları WinSCP kullanarak kopyaladığımda, /var/www/ dosyasında dosya oluştur / değiştir dosyası oluşturamıyorum, çünkü bağlandığım kullanıcının /var/www/ dosyasındaki dosyalara yönelik izinleri yok ve söyleyemiyorum Bir ssh oturumunda yaptığım gibi sudo su .

Bununla nasıl başedebileceğimi biliyor musun?

Yerel makinem üzerinde çalışıyor olsaydım, gksudo nautilus 'yi arardım, ancak bu durumda makineye yalnızca terminal erişimim var.

    
sordu Dimitris Sapikas 29.10.2012 22:03

10 cevap

105

Haklısınız, sudo ile çalışırken scp yok. Bir geçici çözüm, dosyalarınızı dosya oluşturma izninin olduğu bir dizine dosya yüklemek için scp kullanmak, ardından ssh ile oturum açmak ve dosyaları son hedeflerine taşımak / kopyalamak için sudo kullanmaktır.

scp -r folder/ [email protected]:/some/folder/you/dont/need/sudo
ssh [email protected]
 $ sudo mv /some/folder /some/folder/requiring/perms 
# YOU MAY NEED TO CHANGE THE OWNER like:
# sudo chown -R user:user folder

Başka bir çözüm, dosyaları yüklediğiniz dizinlerin izinlerini / sahipliğini değiştirmek olacaktır, böylece ayrıcalıklı olmayan kullanıcınız bu dizinlere yazabilir.

Genellikle, root hesabında çalışmak kural değil, bir istisna olmalıdır - sorunuzu ifade etmenin yolu bana biraz kötüye kullandığınızı düşündürür, bu da normalde izinlerle ilgili sorunlara yol açar. kendi dosyalarınıza erişmek için süper yönetici ayrıcalıklarına ihtiyacınız yoktur.

Teknik olarak, Ubuntu'yu doğrudan root olarak uzaktan oturum açmaya izin verecek şekilde yapılandırabilirsiniz, ancak bu özellik bir sebepten dolayı devre dışı bırakılmıştır, bu yüzden bunu yapmanıza şiddetle tavsiye ediyorum.

    
verilen cevap Sergey 29.10.2012 23:22
28

Başka bir yöntem, scp yerine tar + ssh kullanarak kopyalamaktır:

tar -c -C ./my/local/dir \
  | ssh [email protected] "sudo tar -x --no-same-owner -C /var/www"
    
verilen cevap Willie Wheeler 03.10.2014 20:56
20

Bunu gerçekleştirmek için ansible değerini de kullanabilirsiniz.

ansible'nın copy modülünü kullanarak uzak ana bilgisayara kopyalayın:

ansible -i HOST, -b -m copy -a "src=SRC_FILEPATH dest=DEST_FILEPATH" all

ansible'nın fetch modülünü kullanarak uzak ana bilgisayardan getir:

ansible -i HOST, -b -m fetch -a "src=SRC_FILEPATH dest=DEST_FILEPATH flat=yes" all

NOT:

  • -i HOST, sözdizimindeki virgül bir yazım hatası değil. Bir stok dosyasına ihtiyaç duymadan ansible kullanmanın yolu.
  • -b , sunucudaki işlemlerin root olarak yapılmasına neden olur. -b , --become 'ye genişler ve varsayılan --become-user değeri root, varsayılan --become-method sudo'dur.
  • flat=yes kopyası sadece dosya, dosyaya giden tüm uzak yolu kopyalamıyor
  • Dosya yollarındaki joker karakterleri kullanmak bu uyumlu modüller tarafından desteklenmez.
  • copy modülü tarafından desteklenen bir ismidir , ancak fetch modülü tarafından not .
  • .

Bu Soru için Özel Davet

Burada, dağıtılacak dosyaları içeren yerel ana makinenizdeki dizinin sourcedir olduğunu ve uzak hedefin ana makine adı hostname olduğunu varsayarak, belirli ve tam olarak belirtilen bir örnek:

cd sourcedir && \
ansible \
   --inventory-file hostname, \ 
   --become \
   --become-method sudo \
   --become-user root \
   --module-name copy \
   --args "src=. dest=/var/www/" \
   all

Özlü çağrı ile:

cd sourcedir && \
ansible -i hostname, -b -m copy -a "src=. dest=/var/www/" all

P.S., "sadece bu muhteşem aracı yükle" diyenin bir çeşit olduğunu anlıyorum. sesli uyarı. Ancak, uzak sunucuların yönetimi için süper olmanın yararlı olduğunu anladım. Bu nedenle, yükleme, dosya dağıtmanın ötesinde size başka avantajlar getirecektir.

    
verilen cevap erik.weathers 15.02.2016 08:03
12

sudo su çalıştırdığınızda, oluşturduğunuz tüm dosyalar root'a ait olacaktır, ancak varsayılan olarak ssh veya scp ile root olarak doğrudan oturum açmak mümkün değildir. Ayrıca sudo ile scp kullanmak mümkün değildir, bu yüzden dosyalar kullanılamaz. Bu, dosyalarınız üzerinde sahiplik iddiasında bulunarak düzeltin:

Kullanıcı adınızın dimitri olduğunu varsayarak, bu komutu kullanabilirsiniz.

sudo chown -R dimitri:dimitri /home/dimitri

Bundan sonra, diğer cevaplarda da belirtildiği gibi, "Ubuntu" yolu sudo ve root girişlerini kullanmamaktır. Büyük güvenlik avantajları ile kullanışlı bir paradigmadır.

    
verilen cevap Bailey S 30.10.2012 00:07
8

SSH üzerinden rsync ( Cygwin / cwRsync ’i kullanmanın en iyi yolu) olabilir mi?

Örneğin, www-data sahibiyle dosya yüklemek için:

rsync -a --rsync-path="sudo -u www-data rsync" path_to_local_data/ [email protected]:/var/www

Durumunuzda, root ayrıcalıklarına ihtiyacınız varsa, komut şöyle olacaktır:

rsync -a --rsync-path="sudo rsync" path_to_local_data/ [email protected]:/var/www

Bakınız: sudo ile uzak sunucuya scp .

    
verilen cevap Alexey Vazhnov 15.11.2016 11:14
5

PuTTY yerine OpenSSH araçlarını kullanırsanız, bunu scp ile sunucuda sudo dosya aktarımını başlatarak yapabilirsiniz. Yerel makinenizde çalışan bir sshd daemon olduğundan emin olun. % Co_de% ile sunucuya makinenize ulaşmanın bir yolunu verebilirsiniz.

Makinenizde:

ssh -R 11111:localhost:22 [email protected]

Sunucuya giriş yapmanın yanı sıra, bu işlem sunucunun bağlantı noktası 11111 üzerinde yapılan her bağlantıyı makinenizin bağlantı noktasına iletir. 22: bağlantı noktanız ssh -R dinlenir.

Sunucuda şu şekilde dosya aktarımı başlatın:

cd /var/www/
sudo scp -P 11111 -r [email protected]:FOLDERNAME .
    
verilen cevap bergoid 21.11.2016 17:52
5

Çabuk yol:

ssh [email protected] "sudo cat /etc/dir/file" > /home/user/file
    
verilen cevap Anderson Lira 16.01.2017 14:01
1

Bu konudan esinlenerek yazdığım senaryoyu kullanabilirsiniz:

touch /tmp/justtest && scpassudo /tmp/justtest [email protected]:/tmp/

Ancak bu, bazı çılgın şeyler gerektirir (btw. komut dosyası tarafından otomatik olarak yapılır)

  1. gönderilmekte olan sunucu, kaynak bilgisayara ssh bağlantısı kurarken artık şifre sormayacaktır
  2. Sunucuda sudo isteminin olmaması nedeniyle, sudo artık uzak makinede parola istemiyor

İşte komut dosyası:

interface=wlan0
if [[ $# -ge 3 ]]; then interface=; fi
thisIP=$(ifconfig | grep $interface -b1 | tail -n1 | egrep -o '[0-9.]{4,}' -m1 | head -n 1)
thisUser=$(whoami)
localFilePath=/tmp/justfortest
destIP=192.168.0.2
destUser=silesia
#dest 
#destFolderOnRemoteMachine=/opt/glassfish/glassfish/
#destFolderOnRemoteMachine=/tmp/

if [[ $# -eq 0 ]]; then 
echo -e "Send file to remote server to locatoin where root permision is needed.\n\tusage: %pre% local_filename [[email protected]](ip|host):(remote_folder/|remote_filename) [optionalInterface=wlan0]"
echo -e "Example: \n\ttouch /tmp/justtest &&\n\t %pre% /tmp/justtest [email protected]:/tmp/ "
exit 1
fi

localFilePath=

test -e $localFilePath 

destString=
usernameAndHost=$(echo $destString | cut -f1 -d':')

if [[ "$usernameAndHost" == *"@"* ]]; then
destUser=$(echo $usernameAndHost | cut -f1 -d'@')
destIP=$(echo $usernameAndHost | cut -f2 -d'@')
else
destIP=$usernameAndHost
destUser=$thisUser
fi

destFolderOnRemoteMachine=$(echo $destString | cut -f2 -d':')

set -e #stop script if there is even single error

echo 'First step: we need to be able to execute scp without any user interaction'
echo 'generating public key on machine, which will receive file'
ssh [email protected]$destIP 'test -e ~/.ssh/id_rsa.pub -a -e ~/.ssh/id_rsa || ssh-keygen -t rsa'
echo 'Done'

echo 'Second step: download public key from remote machine to this machine so this machine allows remote machine (this one receiveing file) to login without asking for password'

key=$(ssh [email protected]$destIP 'cat ~/.ssh/id_rsa.pub')
if ! grep "$key" ~/.ssh/authorized_keys; then
echo $key >> ~/.ssh/authorized_keys
echo 'Added key to authorized hosts'
else
echo "Key already exists in authorized keys"
fi

echo "We will want to execute sudo command remotely, which means turning off asking for password"
echo 'This can be done by this tutorial http://stackoverflow.com/a/10310407/781312'
echo 'This you have to do manually: '
echo -e "execute in new terminal: \n\tssh $destUser:$destIP\nPress enter when ready"
read 
echo 'run there sudo visudo'
read
echo 'change '
echo '    %sudo   ALL=(ALL:ALL) ALL'
echo 'to'
echo '    %sudo   ALL=(ALL:ALL) NOPASSWD: ALL'
echo "After this step you will be done."
read

listOfFiles=$(ssh [email protected]$destIP "sudo ls -a")

if [[ "$listOfFiles" != "" ]]; then 
echo "Sending by executing command, in fact, receiving, file on remote machine"
echo 'Note that this command (due to " instead of '', see man bash | less -p''quotes'') is filled with values from local machine'
echo -e "Executing \n\t""identy=~/.ssh/id_rsa; sudo scp -i $identy $(whoami)@$thisIP:$(readlink -f $localFilePath) $destFolderOnRemoteMachine"" \non remote machine"
ssh [email protected]$destIP "identy=~/.ssh/id_rsa; sudo scp -i $identy $(whoami)@$thisIP:$(readlink -f $localFilePath) $destFolderOnRemoteMachine"
ssh [email protected]$destIP "ls ${destFolderOnRemoteMachine%\\n}/$(basename $localFilePath)"
if [[ ! "$?" -eq 0 ]]; then echo "errror in validating"; else echo -e "SUCCESS! Successfully sent\n\t$localFilePath \nto \n\t$destString\nFind more at http://arzoxadi.tk"; fi
else
echo "something went wrong with executing sudo on remote host, failure"

fi
ENDOFSCRIPT
) | sudo tee /usr/bin/scpassudo && chmod +x /usr/bin/scpassudo
    
verilen cevap test30 21.11.2013 20:47
1

Kök olarak oturum açamayan ve kullanıcılarınızla dosyalara erişme iznine sahip olmayan sunucular arasında dosya aktarmak için ssh, sudo ve ör. katmanı birleştirebilirsiniz. Bu biraz ciddiye, bu yüzden buna yardımcı olacak bir senaryo yazdım. Komut dosyasını burada bulabilirsiniz: İşte

veya burada:

#! /bin/bash
res=0
from=
to=
shift
shift
files="[email protected]"
if test -z "$from" -o -z "$to" -o -z "$files"
then
    echo "Usage: %pre%    (file)*"
    echo "example: %pre% server1 server2 /usr/bin/myapp"
    exit 1
fi

read -s -p "Enter Password: " sudopassword
echo ""
temp1=$(mktemp)
temp2=$(mktemp)
(echo "$sudopassword";echo "$sudopassword"|ssh $from sudo -S tar c -P -C / $files 2>$temp1)|ssh $to sudo -S tar x -v -P -C / 2>$temp2
sourceres=${PIPESTATUS[0]}
if [ $? -ne 0 -o $sourceres -ne 0 ]
then
    echo "Failure!" >&2
    echo "$from output:" >&2
    cat $temp1 >&2
    echo "" >&2
    echo "$to output:" >&2
    cat $temp2 >&2
    res=1
fi

rm $temp1 $temp2
exit $res
    
verilen cevap sigmunda 01.07.2015 17:16
0

İşte Willie Wheeler'ın katranın üzerinden dosya (lar) transfer eden ancak aynı zamanda uzak ana bilgisayarda sudo'ya bir parola geçirmeyi destekleyen cevabının değiştirilmiş bir versiyonu.

(stty -echo; read passwd; stty echo; echo $passwd; tar -cz foo.*) \
  | ssh remote_host "sudo -S bash -c \"tar -C /var/www/ -xz; echo\""

Burada ekstra büyü biraz sudo için -S seçeneğidir. Sudo man sayfasından:

  

-S, --stdin                    Komutu standart hataya yazın ve terminal cihazını kullanmak yerine standart girişten şifreyi okuyun. Şifre yeni satır karakteriyle takip edilmelidir.

Şimdi aslında katranın çıkışının ssh içine alınmasını ve ssh'in stdin'ini katranın stdout'una yönlendirmesini ve şifrenin interaktif terminalden sudo'ya geçmesini sağlamayı istiyoruz. (Biz, uzaktaki ucunda bir ASKPASS özelliğini kullanabiliriz ama bu başka bir hikaye.) Şifreyi sudo'ya önceden yakalayarak ve bir alt kabukta bu işlemleri gerçekleştirerek ve çıktıları pipetleyerek katran çıkışına hazırlayarak yapabiliriz. subshell ssh içine. Bu ayrıca, etkileşimli kabuğumuzda parola sarktığımız bir ortam değişkeni bırakmama avantajına da sahiptir.

Bir komut istemi yazdırmak için -p seçeneğiyle 'oku' yapmadığımı fark edersiniz. Bunun nedeni, sudo'dan gelen parola isteğinin, ssh ile etkileşimli kabuğumuzun stderr'ine geri döndürülmesidir. "Sudo'nun içinde çalıştığı için sudo'nun bizim borumuzun sağında nasıl yürüdüğü" diye merak edebilirsiniz. Birden çok komut yürüttüğümüzde ve diğerinin çıkışını pipetlediğimizde, ana kabuk (bu durumda etkileşimli kabuk), her bir komutu bir önceki yürütme işleminden hemen sonra sırayla yürütür. Bir borunun arkasındaki her komut yürütüldüğünde, ana kabuk sol taraftaki stdout'u sağ tarafın stdinine bağlar (yönlendirir). Çıktı daha sonra süreçlerden geçerken girdi olur. Bunu, komutun tamamını yazıp işlem grubunu (Ctrl-z) arkamıza alarak şifrenizi yazıp işlem ağacını görüntüleyerek görebiliyoruz.

$ (stty -echo; read passwd; stty echo; echo $passwd; tar -cz foo.*) | ssh 
remote_host "sudo -S bash -c \"tar -C /var/www/ -xz; echo\""
[sudo] password for bruce: 
[1]+  Stopped                 ( stty -echo; read passwd; stty echo; echo 
$passwd; tar -cz foo.* ) | ssh remote_host "sudo -S bash -c \"tar -C 
/var/www/ -xz; echo\""

$ pstree -lap $$
bash,7168
  ├─bash,7969
  ├─pstree,7972 -lap 7168
  └─ssh,7970 remote_host sudo -S bash -c "tar -C /var/www/ -xz; echo"'

Etkileşimli kabuğumuz PID 7168, alt kabuğumuz PID 7969 ve ssh işlemimiz PID 7970.

Tek dezavantajı, sudo'nun istemini geri göndermesi için zamanın bulunmasından önce okunmayı kabul etmektir. Hızlı bağlantı ve hızlı uzak ana bilgisayarda bunu fark etmeyeceksiniz, ancak ya yavaşsa. Herhangi bir gecikme, istem girme yeteneğini etkilemez; yazmaya başlamanızdan sonra görünebilir.

Not Demo için yerel makineme "remote_Host" için bir ana makine dosyası girişi ekledim.

    
verilen cevap Bruce 06.05.2017 12:17

Etiketlerdeki diğer soruları oku