답변:
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 에는 소유자, 그룹 등을 보존 할 수있는 것과 같은 가치를 추가 할 수있는 다른 옵션도 많이 있습니다 .
--perms
합니다. explainshell.com/...
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
host2에서 :
[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로 드롭하면 여기서 포함 된 tar 파일 만 호스트 1에서 tard되어 STDOUT (일명--)을 통해 전송 된 다음 host2에서 tar 해제 될 수 있습니다.
참고 : 왜 작동합니까? Tar의 기본 동작은 원격 사용자의 umask를 사용하여 파일의 압축을 푸는 것입니다. 위의 예 에서 원격 타르가 원격 측의 권한을 변경하고 있음을 보여주는 다른 것으로 명시 적으로 설정하기 위해 umask 명령을 포함 시켰습니다 .
umask
. 예를 들어 로컬 파일의 경우 하위 서버 만 대상 서버에서 700
파일을 가져올 수 없거나 755
잘못 되었습니까?
umask
. 원격 서버에 쓸 때 전체 파일 세트에 대해서만 파일 을 설정할 수 있습니다 . 다른 파일에 대한 개별 제어는 없습니다. 예를 들어 원격 배포에 복사 할 때 랩톱에서 정상인 편안한 권한을 제거하고 싶기 때문에 자주 사용합니다.
--no-same-permissions
에 따르면 정확 tar
합니다. 예제에서 프롬프트를 변경 했으므로 혼동되지 않습니다.
파이썬으로 작업을위한 작은 스크립트를 작성했습니다. 당신은 할 수 파이썬 script.py -p O + 일부 파일 일부 / 디렉토리 /에 /은 / 서버를 R /
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)
UNIX 변형에 업로드한다고 가정하면 권한이 UMASK 설정을 따라야한다고 생각합니다. 도트 파일이 SCP에 대해 처리되는 것을 맨 위에서 기억하지는 않지만 UMASK를 해당 파일 중 하나에 설정하면 생성 한 파일에 따라 UMASK에 따라 권한이 설정됩니다. 원격 시스템에서 사용하는 쉘에 따라 다를 수 있습니다.
당신이 무엇을하든, 당신이 원하는 것과 정확히 반대되는 -p 옵션을 사용하지 마십시오.