Я загружаю файлы в свою учетную запись оболочки, используя scp. Поскольку мне нужны другие разрешения на сервере, чем на моем компьютере, я хотел бы иметь возможность легко изменять разрешения при загрузке без необходимости использовать ssh для учетной записи и изменять их вручную.
7 ответов
Если вы копируете с компьютера с Windows, вы можете использовать WinSCP для копирования, и у него есть возможность установить разрешения для копируемых файлов после загрузки.
Если нет, я думаю, что ваш единственный выбор - выполнить chmod на сервере после загрузки, что вы можете сделать удаленно с помощью команды ssh:
scp /path/to/file server:/server/path/to/file
ssh server chmod 644 /server/path/to/file
Моим предпочтительным рабочим решением было бы использовать вместо этого rsync
:
Заменить:
scp /path/to/file server:/server/path/to/file
С:
rsync --chmod=u+rwx,g+rwx,o+rwx /path/to/file server:/path/to/file
Это мешает вам пройти аутентификацию дважды. Есть также много других опций с rsync, которые, вероятно, добавят ценность, например, возможность сохранить владельца, группу и т.д.
Я провел несколько экспериментов с scp. Для новых файлов, загружаемых на целевой сервер, файлы имеют те же разрешения, что и на исходном сервере. Если существующие файлы перезаписываются на целевом сервере, разрешения для этих файлов не меняются.
Я провел эти эксперименты с CentOS 4.6.
Вы можете сделать это, используя tar, ssh, & umask следующим образом:
на хосте 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
на хосте 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
Вы можете сбросить ключ -v на tar, который я включил здесь, просто для того, чтобы вы могли видеть файлы, которые были скопированы на host1 и отправлены через STDOUT (aka. -), а затем стали un-tarred на host2.
ПРИМЕЧАНИЕ: почему это работает? Поведение Tar по умолчанию распаковывает файлы, используя umask удаленного пользователя. В приведенном выше примере я включил команду umask, чтобы явно установить для нее что-то другое, что демонстрирует, что удаленный tar изменяет разрешения на удаленной стороне.
Я написал небольшой скрипт для задачи на Python. Вы можете сделать python script.py -p o+r для некоторых файлов: /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)
Я бы посоветовал установить бит закрепления в папке, чтобы файлы, которые вы загружаете в эту папку, автоматически получали это разрешение.
chmod 1644 dir
"1", использованное выше, устанавливает бит прилипания.
так что вам нужно только загрузить одну и не запускать другую команду впоследствии.
Предполагая, что вы загружаете в вариант UNIX, я думаю, что разрешения должны соответствовать вашим настройкам UMASK. Я не могу вспомнить, какие точечные файлы обрабатываются для SCP, но если вы установите UMASK в один из тех файлов, которые вы создадите, будут установлены его разрешения на его основе. Вероятно, это зависит от того, какую оболочку вы используете в удаленной системе.
Что бы вы ни делали, не используйте опцию -p, так как она делает то, что вам нужно.