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.
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.
Odpowiedzi:
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
Moim preferowanym rozwiązaniem roboczym byłoby użycie rsync
zamiast 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.
--perms
. wyjaśnia
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.
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.
umask
tylko uprawnienia odejmujące, np. Dla pliku lokalnego, w 700
którym nie można uzyskać pliku 755
na serwerze docelowym, czy się mylę?
--no-same-permissions
drugiego tar
użycia, jeśli użytkownik docelowy jest rootem, patrz superuser.com/a/383801/89031
umask
cał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.
--no-same-permissions
jest to również poprawne według tar
strony podręcznika man. Zmieniłem podpowiedzi w moim przykładzie, więc nie ma co do tego wątpliwości.
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)
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.
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.