Zmień uprawnienia po przesłaniu za pomocą scp

44

Przesyłam pliki na konto powłoki za pomocą scp. Ponieważ potrzebuję innych uprawnień na serwerze niż na moim komputerze, chciałbym mieć sposób na łatwą zmianę uprawnień po przesłaniu bez konieczności ssh na koncie i zmieniania ich ręcznie.

Florian Mayer
źródło

Odpowiedzi:

29

Jeśli kopiujesz z komputera z systemem Windows, możesz użyć WinSCP do kopiowania, a on ma opcję ustawienia uprawnień do skopiowanych plików po przesłaniu.

Jeśli nie, myślę, że jedynym wyborem jest uruchomienie chmod na serwerze po przesłaniu, co można zrobić zdalnie za pomocą polecenia ssh:

scp /path/to/file server:/server/path/to/file
ssh server chmod 644 /server/path/to/file
zigdon
źródło
Też o tym myślałem, a co z ładowaniem katalogów?
Florian Mayer,
Hm, mógłbym wtedy zrobić chmod -R. Chyba niezły pomysł.
Florian Mayer,
1
Dobrze. scp -r, a następnie ssh chmod -R
zigdon
1
Miałem również sukces, robiąc to samo z plink i PSCP (z pakietu szpachli)
stevepastelan
22

Moim preferowanym rozwiązaniem roboczym byłoby użycie rsynczamiast tego:

Zastąpić:

scp /path/to/file server:/server/path/to/file

Z:

rsync --chmod=u+rwx,g+rwx,o+rwx /path/to/file server:/path/to/file

Zapobiega to dwukrotnemu uwierzytelnieniu. Istnieje również wiele innych opcji z rsync, które prawdopodobnie zwiększyłyby wartość, taką jak możliwość zachowania właściciela, grupy itp.

JRomero
źródło
To nie działa.
soham
1
Znalazłem przyczynę. Musisz także użyć --perms. wyjaśnia
Shell.com/...
5
Czy mógłbyś pokazać pełny, ważny, dowodzący, pelase? Albo jako komentarz, albo przez edycję odpowiedzi
Mawg,
6

Przeprowadziłem kilka eksperymentów z scp. W przypadku nowych plików przesyłanych na serwer docelowy pliki mają takie same uprawnienia jak na serwerze źródłowym. Jeśli istniejące pliki zostaną zastąpione na serwerze docelowym, uprawnienia do tych plików nie ulegną zmianie.

Przeprowadziłem te eksperymenty z CentOS 4.6.

Jingguo Yao
źródło
3
To powinien być komentarz zamiast odpowiedzi
Jaime Hablutzel
2
Znowu (ale to naprawdę pomogło ;-)
Mawg,
To właśnie próbuję obejść za jednym razem za pomocą skryptu. Rsync nie zawsze znajduje się na serwerze docelowym i wolałbym, aby skrypt, który rozdaję, nie zabrałby swobody w apt / yum itp., Aby zainstalować rsync. Wydaje się, że być może będę musiał użyć metody scp + chmod lub rm + scp, aby upewnić się, że uprawnienia są prawidłowe. : - /
zaTricky
5

Możesz to zrobić za pomocą tar, ssh i umask w następujący sposób:

na hoście 1:

[saml@host1 testdir]$ pwd
/tmp/testdir

[saml@host1 testdir]$ ls -l
total 12
-rw-r--r--  1 saml saml 21 May 19 00:21 file1
-rw-r--r--  1 saml saml 48 May 19 00:21 file2
-rw-r--r--  1 saml saml 28 May 19 00:21 file3

[saml@host1 testdir]$ tar cvf - . | (ssh host2 "umask 0277; cd /tmp/testdir;tar xvf -")
./
./file1
./file2
./file3
./
./file1
./file2
./file3

na hoście 2:

[samr@host2 testdir]$ pwd
/tmp/testdir

[samr@host2 testdir]$ ls -l
total 12
-r-------- 1 samr web 21 May 19 00:21 file1
-r-------- 1 samr web 48 May 19 00:21 file2
-r-------- 1 samr web 28 May 19 00:21 file3

Możesz upuścić przełączniki -v na tar, które tu zawarłem, abyś mógł zobaczyć, jak pliki są dzielone na host1 i wysyłane przez STDOUT (aka. -), a następnie usuwane z tar-hosta na host2.

UWAGA: Dlaczego to działa? Domyślnym zachowaniem Tar jest rozpakowywanie plików za pomocą umask użytkownika zdalnego. W powyższym przykładzie zawarłem polecenie umask, aby jawnie ustawić go na coś innego, co pokazuje, że zdalna tar zmienia uprawnienia po stronie zdalnej.

slm
źródło
1
Jak widzę za pomocą tego polecenia, możesz zastosować tylko mniej uprawnień do przesyłanych plików, ponieważ umasktylko uprawnienia odejmujące, np. Dla pliku lokalnego, w 700którym nie można uzyskać pliku 755na serwerze docelowym, czy się mylę?
Jaime Hablutzel,
1
Ponadto potrzebujesz --no-same-permissionsdrugiego tarużycia, jeśli użytkownik docelowy jest rootem, patrz superuser.com/a/383801/89031
Jaime Hablutzel,
@jaime - to prawda, pozwoli ci to tylko ustawić umaskcały zestaw plików zapisywanych na zdalnym serwerze. Nie ma indywidualnej kontroli dla różnych plików. Często tego używam, ponieważ chcę pozbawić uprawnienia, które były OK na moim laptopie, na przykład podczas kopiowania do zdalnego wdrożenia.
slm
@jaime - --no-same-permissionsjest to również poprawne według tarstrony podręcznika man. Zmieniłem podpowiedzi w moim przykładzie, więc nie ma co do tego wątpliwości.
slm
3

Napisałem mały skrypt dla zadania w Pythonie. Możesz zrobić skrypt w python script.py -p o + r niektóre pliki / dir / on / the / server /

import subprocess
import sys
from optparse import OptionParser


DEFAULT_SERVER = 'your.server.com'

parser = OptionParser()

parser.add_option("-p", "--permissions", action="store", 
                     type="str", dest="perm", metavar="PERM",
                     help="chmod files to PERM", default=None)
parser.add_option("-s", "--server", action="store", 
                     type="str", dest="serv", metavar="SERVER",
                     help="scp to SERVER", default=DEFAULT_SERVER)

options, args = parser.parse_args()
files = args[:-1]
direct = args[-1]

proc = subprocess.Popen(['scp'] + files + ['%s:%s' % (options.serv, direct)],
                        stdout=subprocess.PIPE, stderr=subprocess.PIPE)
if proc.wait() != 0:
    print >>sys.stderr, "Uploading failed!"
    sys.exit(1)

if options.perm is not None:
    arg_dict = dict(dir=direct, perm=options.perm, files=' '.join(files))
    proc = subprocess.Popen(['ssh', options.serv, 'cd %(dir)s;'
                             'chmod -R %(perm)s %(files)s' % arg_dict],
                            stdout=subprocess.PIPE, stderr=subprocess.PIPE)
Florian Mayer
źródło
3
Czy masz coś przeciwko opublikowaniu kodu w Code Review . Mogą tam być dobre sugestie dotyczące tego, jak można to poprawić.
tshepang
1
Wow, nigdy nie słyszałem o nowej stronie SO, Code Review, ty @Tshepang!
AnneTheAgile
2
@AnneTheAgile to nie jest takie nowe; ma ponad 3 lata :)
tshepang
1

Sugerowałbym skonfigurowanie lepkiego bitu w folderze, aby pliki przesyłane w tym folderze automatycznie otrzymały to uprawnienie.

chmod 1644 reż

„1” użyte powyżej ustawia lepki bit.

więc musisz tylko przesłać jedną i nie musisz później uruchamiać innej komendy.

DaveDeveloper
źródło
Czy ktoś może wyjaśnić, jak to będzie działać?
Mawg,
0

Zakładając, że przesyłasz do wariantu UNIX, uważam, że uprawnienia powinny być zgodne z ustawieniami UMASK. Nie przypominam sobie z góry głowy, które pliki kropkowe są przetwarzane dla SCP, ale jeśli ustawisz UMASK w jednym z tych plików, które utworzysz, będzie miał ustawione uprawnienia na podstawie tego. Prawdopodobnie zależy to od powłoki używanej w systemie zdalnym.

Cokolwiek robisz, nie używaj opcji -p, ponieważ robi to dokładnie odwrotność tego, co chcesz.

tvanfosson
źródło
Nie. -p nie jest tym, czego chciałem, ponieważ potrzebuję innych uprawnień na serwerze (tak, to UNIX) niż na moim komputerze lokalnym. Mógłbym oczywiście je chmod, użyć -p, a następnie chmod je z powrotem, chociaż wtedy musiałbym zachować uprawnienia.
Florian Mayer,
Nie sugerowałem, że używasz -p, tylko potwierdzam, że tak było. Wyjaśnię mój post.
tvanfosson,