Hogyan másolhatok fájlokat, amelyek gyökér hozzáférést igényelnek scp-vel?

137

Van egy Ubuntu szerver, amelyhez az SSH használatával csatlakozom.

Fel kell töltenem a fájlokat a gépemen a/var/www/ -ra a kiszolgálón, a/var/www/ fájlok aroot tulajdonában vannak.

A PuTTY használatával a bejelentkezés után be kell írnom asudo su -ot és a jelszót, hogy képesek legyenek a/var/www/ fájlok módosítására.

De amikor fájlokat másolok a WinSCP használatával, nem tudok létrehozni / módosítani a (z)/var/www/ fájlokat, mert a felhasználó, akivel csatlakozom, nem rendelkezik engedélyekkel a (z)/var/www/ fájlban, és nem mondhatom sudo su, mint egy ssh-munkamenet esetén.

Tudod, hogyan tudnék ezzel foglalkozni?

Ha a helyi gépemen dolgoztam, akkor hívnám agksudo nautilus -ot, de ebben az esetben csak a terminál hozzáférése van a géphez.

    
készlet Dimitris Sapikas 29.10.2012 22:03
forrás

10 válasz

106

Igazad van, nincssudo, hascp -kal dolgozol. A megoldás az, ha ascp fájlt fel szeretné tölteni egy olyan könyvtárba, ahol a felhasználó jogosult fájlokat létrehozni, majd jelentkezzen be ssh-on keresztül, és használja asudo fájlt a fájlok végső célhelyre történő áthelyezéséhez.

scp -r folder/ user@server.tld:/some/folder/you/dont/need/sudo
ssh user@server.tld
 $ sudo mv /some/folder /some/folder/requiring/perms 
# YOU MAY NEED TO CHANGE THE OWNER like:
# sudo chown -R user:user folder

A másik megoldás a fájlok feltöltését végző könyvtárak engedélyeinek / tulajdonjogának megváltoztatása, így a nem privilegizált felhasználó képes írni ezeket a könyvtárakat.

Általánosságban aroot számlán végzett munka kivételnek és nem szabálynak kell lennie - a kérdésed megfogalmazásának módja miatt gondolom, hogy talán egy kicsit visszaélsz, ami az engedélyekkel kapcsolatos problémákhoz vezet normál olyan körülmények esetén, amelyekre nem kell szuperfelügyeleti jogosultságokkal rendelkezni a saját fájljainak eléréséhez.

Technikailag beállíthatja az Ubuntu-t, hogy engedélyezze a távoli bejelentkezést közvetlenülroot -ként, de ez a funkció valamilyen okból le van tiltva, ezért határozottan tanácsot adnék ellenük.

    
válasz adott Sergey 29.10.2012 23:22
forrás
29

Más módszer az, hogy másoljuk a tar + ssh parancsot a scp helyett:

tar -c -C ./my/local/dir \
  | ssh dimitris@myserver.com "sudo tar -x --no-same-owner -C /var/www"
    
válasz adott Willie Wheeler 03.10.2014 20:56
forrás
23

Ezenkívül aansible is használható.

Másolás távoli gépre a értesítőcopy modulja segítségével :

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

A távoli kiszolgálóról lekérés a értesítőfetch modulján :

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

Megjegyzés:

  • A-i HOST, szintaxisban lévő vessző nem hibás. Ez a módja annak, hogy az adathordozó fájl nélkül is használható legyen.
  • -b a szerveren végrehajtott műveleteket gyökérként teszi. -b kiterjeszti a--become értékre, és az alapértelmezett--become-user a root, az alapértelmezett--become-method pedig sudo.
  • flat=yes példány csak a fájlt, nem másolja a fájlhoz vezető teljes távoli elérési utat
  • Az illesztő modulok nem támogatják a fájlok elérési útvonalakhoz tartozó karakterkészletek használatát.
  • Acopy modul, de a nem afetch modul által támogatott könyvtár másolása

Speciális hívás ehhez a kérdéshez

Íme egy példa, amely specifikus és teljes mértékben meg van adva, feltételezve, hogy a megosztott fájlokat tartalmazó helyi gépen lévő könyvtársourcedir, és hogy a távoli célgép nevehostname:

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

A tömör hívás:

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

P.S., rájöttem, hogy a "csak telepíteni ezt a mesés eszközt" valamilyen hang-deaf válasz. De úgy találtam, hogy szuper hasznos lehet a távoli szerverek kezeléséhez, ezért a telepítés során biztosan más előnyökkel jár, mint a fájlok telepítése.

    
válasz adott erik.weathers 15.02.2016 08:03
forrás
12

Hasudo su -ot futtatsz, az általad létrehozott fájlok a root tulajdonában lesznek, de alapértelmezés szerint nem lehet közvetlenül rootként bejelentkezni az ssh vagy scp használatával. A sudo nem használható scp-vel, így a fájlok nem használhatók. Erősítse meg ezt a tulajdonjogot a fájlok felett:

Feltéve, hogy a felhasználónéved dimitri volt, használhatod ezt a parancsot.

sudo chown -R dimitri:dimitri /home/dimitri

Ettől kezdve, ahogy más válaszok is említik, az "Ubuntu" módszer a sudo használata, nem pedig a root bejelentkezések használata. Ez egy hasznos paradigma, nagy biztonsági előnyökkel.

    
válasz adott Bailey S 30.10.2012 00:07
forrás
8

A legjobb módja arsync ( Cygwin / cwRsync használata Windows alatt az SSH-n keresztül?

Például awww-data:

tulajdonosokkal való fájlok feltöltéséhez
rsync -a --rsync-path="sudo -u www-data rsync" path_to_local_data/ login@srv01.example.com:/var/www

Az Ön esetében, ha root jogosultságokra van szüksége, a parancs így fog megjelenni:

rsync -a --rsync-path="sudo rsync" path_to_local_data/ login@srv01.example.com:/var/www

Lásd: scp a távoli kiszolgálóhoz a sudo-val .

    
válasz adott Alexey Vazhnov 15.11.2016 11:14
forrás
6

Gyorsan:

ssh user@server "sudo cat /etc/dir/file" > /home/user/file
    
válasz adott Anderson Lira 16.01.2017 14:01
forrás
5

Ha az OpenSSH eszközt használja a PuTTY helyett, akkor ezt végrehajthatja ascp fájltovábbítással a szerveren asudo paranccsal. Győződjön meg róla, hogysshd daemon fut a helyi gépen. Assh -R segítségével megadhatja a kiszolgálónak a kapcsolatot a gépével.

A készüléken:

ssh -R 11111:localhost:22 REMOTE_USERNAME@SERVERNAME

A kiszolgálón történő bejelentkezés mellett a kiszolgáló 11111-es portján minden csatlakozást továbbít a gép 22-es portjára: asshd -nak hallgatja a portot.

A kiszolgálón indítsa el a fájlátvitelt:

cd /var/www/
sudo scp -P 11111 -r LOCAL_USERNAME@localhost:FOLDERNAME .
    
válasz adott bergoid 21.11.2016 17:52
forrás
1

Lehet, hogy a szkriptet, amelyet írtam, a témában inspirálta:

touch /tmp/justtest && scpassudo /tmp/justtest remoteuser@ssh.superserver.com:/tmp/

de ehhez valami őrült dolog szükséges (ami a parancsfájl automatikus végrehajtása)

    A
  1. kiszolgáló, amelyikhez a fájlt küldik, nem fogja jelszót kérni, amikor létrehozza az ssh kapcsolatot a forrásklienssel
  2. a sudo prompt hiányának szükségessége miatt a kiszolgálón a sudo nem fog többé jelszót kérni a távoli gépen, a felhasználónak

Itt megy a szkript:

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: %pr_dfe% local_filename [username@](ip|host):(remote_folder/|remote_filename) [optionalInterface=wlan0]"
echo -e "Example: \n\ttouch /tmp/justtest &&\n\t %pr_dfe% /tmp/justtest remoteuser@ssh.superserver.com:/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 $destUser@$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 $destUser@$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 $destUser@$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 $destUser@$destIP "identy=~/.ssh/id_rsa; sudo scp -i $identy $(whoami)@$thisIP:$(readlink -f $localFilePath) $destFolderOnRemoteMachine"
ssh $destUser@$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
    
válasz adott test30 21.11.2013 20:47
forrás
1

Az ssh, a sudo és az e-tar könyvtárat a fájlok közötti fájlok átvitelére használhatja anélkül, hogy rootként jelentkezne be, és nem lenne jogosult a fájlok elérésére a felhasználóval. Ez kissé félelmetes, ezért írtam egy forgatókönyvet, hogy segítsek. A szkript itt található: link

vagy itt:

#! /bin/bash
res=0
from=
to=
shift
shift
files="$@"
if test -z "$from" -o -z "$to" -o -z "$files"
then
    echo "Usage: %pr_dfe%    (file)*"
    echo "example: %pr_dfe% 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
    
válasz adott sigmunda 01.07.2015 17:16
forrás
0

Itt van egy módosított változata Willie Wheeler válasza, amely átmásolja a fájlokat a taron keresztül, de támogatja a távoli gépen a sudo használatához szükséges jelszót.

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

A kis extra mágia itt a -D opció sudo-nak. A sudo man oldalán:

  

-S, --stdin                    Írja be a parancsot a standard hibára, és olvassa el a jelszót a szabványos bemenetről a terminál eszköz használata helyett. A jelszót újvonalas karakternek kell követnie.

Most valóban azt szeretnénk, hogy a kátrány kimenete ssh-ba kerüljön, és átirányítja az ssh stdinjét a kátrányba, eltávolítva a jelszót a interaktív terminálról a sudo-ba. (Használhatjuk a sudo ASKPASS funkcióját a távoli végén, de ez egy újabb történet.) A jelszót a sudo-ba is be lehet szerezni, még akkor is, ha előzetesen rögzítjük és eljuttatjuk a kátrány kimenethez, az algoritmus az ssh-be. Ez azzal a további előnnyel is jár, hogy nem hagyunk olyan környezeti változót, amely a jelszavunkat az interaktív héjunkban zuhanja.

Figyelmeztetni fogod, hogy nem hajtottam végre a "read" -ot a -p paranccsal a parancs kiadásához. Ez azért van így, mert a sudo jelszó-kérése kényelmesen visszavezethető az interaktív shell ssh-ről az ssh segítségével. Lehet, hogy csodálkozna "hogyan történik a sudo végrehajtása, mivel az ssh belül fut a csövünk jobb oldalán?" Ha több parancsot hajtunk végre, és az egyiket másra forgatjuk, a szülői héj (az interaktív héj ebben az esetben) minden parancsot végrehajt a sorozatban közvetlenül az előző végrehajtása után. Mivel a parancs mögött minden parancs végrehajtásra kerül, a szülőhéj baloldali stdout-ot (átirányítja) a jobb oldali stdinhez. A kimenet akkor lép be, amikor átmegy a folyamatokon. Láthatja ezt a műveletet végrehajtva a teljes parancsot és a folyamatcsoportot (Ctrl-z) a jelszó beírása előtt, majd megtekintheti a folyamatfát.

$ (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"'

Az interaktív héjunk a PID 7168, a PID 7969 alapcsomagja és ssh folyamatunk a PID 7970.

Az egyetlen hátránya az, hogy az olvasás elfogadja a bemenetet, mielőtt a sudo ideje visszaszállítani a promptot. A gyors kapcsolat és a gyors távoli fogadó nem fogja észrevenni ezt, de lehet, ha lassú vagy. Bármely késleltetés nem befolyásolja a prompt beírásának képességét; előfordulhat, hogy megjelenik a gépelés megkezdése után.

Megjegyzés: A demóhoz egyszerűen hozzáadtam a "remote_Host" állomásfájl-bejegyzést a helyi gépemhez.

    
válasz adott Bruce 06.05.2017 12:17
forrás