scp로 업로드시 권한 변경


44

scp를 사용하여 쉘 계정에 파일을 업로드하고 있습니다. 컴퓨터와 서버에 대한 다른 권한이 필요하므로 계정에 ssh하고 수동으로 변경할 필요없이 업로드시 권한을 쉽게 변경할 수있는 방법을 원합니다.

답변:


29

Windows 컴퓨터에서 복사하는 경우 WinSCP 를 사용 하여 복사 할 수 있으며 업로드 후 복사 된 파일에 대한 권한을 설정하는 옵션이 있습니다.

그렇지 않다면 업로드 후 서버에서 chmod를 실행하는 것이 유일한 선택이라고 생각합니다 .ssh 명령으로 원격으로 수행 할 수 있습니다.

scp /path/to/file server:/server/path/to/file
ssh server chmod 644 /server/path/to/file

나는 그것에 대해서도 생각했다. 그러면 디렉토리를 업로드하는 것은 어떨까?
Florian Mayer

흠, 그럼 chmod -R을 할 수 있습니다. 내가 생각하는 것은 나쁜 생각이 아니다.
Florian Mayer

1
권리. scp -r, ssh chmod -R
zigdon

1
또한 plink와 pscp (퍼티 패키지에서)로 같은 일을하는 데 성공했습니다
stevepastelan

22

내가 선호하는 작업 솔루션은 다음을 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 에는 소유자, 그룹 등을 보존 할 수있는 것과 같은 가치를 추가 할 수있는 다른 옵션도 많이 있습니다 .


작동하지 않습니다.
soham

1
원인을 알았습니다. 당신도 사용해야 --perms합니다. explainshell.com/...
soham

5
당신은 완전한, 유효한 명령, pelase를 보여줄 수 있습니까? 의견으로 또는 답변을 편집하여
Mawg

6

scp로 몇 가지 실험을했습니다. 대상 서버에 업로드 된 새 파일의 경우 파일은 원본 서버에서와 동일한 권한을 갖습니다. 대상 서버에서 기존 파일을 덮어 쓰면 해당 파일에 대한 권한이 변경되지 않습니다.

CentOS 4.6에서 이러한 실험을 수행했습니다.


3
답변이 아닌 의견이어야합니다.
Jaime Hablutzel

2
Agred (그러나 정말 도움이되었습니다 ;-)
Mawg

이것이 스크립트를 통해 한 번에 해결하려는 것입니다. Rsync가 항상 대상 서버에있는 것은 아니며 내가 제공하는 스크립트가 rsync를 설치하기 위해 apt / yum 등의 자유를 얻지 않기를 바랍니다. 권한이 올바른지 확인하기 위해 scp + chmod 또는 rm + scp 메소드를 사용해야 할 것 같습니다. :-/
zaTricky

5

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 명령을 포함 시켰습니다 .


1
이 명령으로 볼 수 있듯이 전송 파일에 더 적은 권한 만 적용 할 수 있습니다 umask. 예를 들어 로컬 파일의 경우 하위 서버 만 대상 서버에서 700파일을 가져올 수 없거나 755잘못 되었습니까?
Jaime Hablutzel

1
또한 대상 사용자가 루트 인 경우 --no-same-permissions두 번째 tar사용법 이 필요 합니다. superuser.com/a/383801/89031
Jaime Hablutzel

@jaime-맞습니다 umask. 원격 서버에 쓸 때 전체 파일 세트에 대해서만 파일 을 설정할 수 있습니다 . 다른 파일에 대한 개별 제어는 없습니다. 예를 들어 원격 배포에 복사 할 때 랩톱에서 정상인 편안한 권한을 제거하고 싶기 때문에 자주 사용합니다.
slm

@jaime- 의 man 페이지 --no-same-permissions에 따르면 정확 tar합니다. 예제에서 프롬프트를 변경 했으므로 혼동되지 않습니다.
slm

3

파이썬으로 작업을위한 작은 스크립트를 작성했습니다. 당신은 할 수 파이썬 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)

3
당신은 당신의 코드를 게시 될까요 코드 검토 . 개선 방법에 대한 좋은 제안이있을 수 있습니다.
tshepang

1
와우, 나는 새로운 SO 사이트, Code Review, ty @Tshepang에 대해 들어 본 적이 없습니다!
AnneTheAgile 18

2
@AnneTheAgile 그것은 새로운 것이 아닙니다. 그것은 3 세 이상 :)
tshepang

1

해당 폴더 아래에 업로드 한 파일이 자동으로 해당 권한을 갖도록 폴더에 고정 비트를 설정하는 것이 좋습니다.

chmod 1644 디렉토리

위에서 사용 된 "1"은 스티키 비트를 설정합니다.

따라서 하나만 업로드하고 나중에 다른 명령을 실행할 필요가 없습니다.


누군가 이것이 어떻게 작동하는지 설명 할 수 있습니까?
Mawg

0

UNIX 변형에 업로드한다고 가정하면 권한이 UMASK 설정을 따라야한다고 생각합니다. 도트 파일이 SCP에 대해 처리되는 것을 맨 위에서 기억하지는 않지만 UMASK를 해당 파일 중 하나에 설정하면 생성 한 파일에 따라 UMASK에 따라 권한이 설정됩니다. 원격 시스템에서 사용하는 쉘에 따라 다를 수 있습니다.

당신이 무엇을하든, 당신이 원하는 것과 정확히 반대되는 -p 옵션을 사용하지 마십시오.


아니. -p는 로컬 컴퓨터와 다른 서버 (예 : UNIX)에 대한 다른 권한이 필요하기 때문에 원하는 것이 아닙니다. 물론 권한을 저장해야하지만 chmod를 사용할 수 있습니다 .-p를 사용한 다음 chmod를 다시 되돌릴 수 있습니다.
Florian Mayer

나는 당신이 -p를 사용하라고 제안하는 것이 아니라 단지 당신을 확인했다. 내 게시물을 명확하게 설명하겠습니다.
tvanfosson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.