Thay đổi quyền khi tải lên bằng scp


44

Tôi đang tải tập tin lên tài khoản shell của mình bằng scp. Vì tôi cần các quyền khác nhau trên máy chủ so với trên máy tính của mình, tôi muốn có một cách dễ dàng thay đổi các quyền khi tải lên mà không cần phải ssh vào tài khoản và thay đổi chúng theo cách thủ công.

Câu trả lời:


29

Nếu bạn đang sao chép từ máy windows, bạn có thể sử dụng WinSCP để sao chép và nó có tùy chọn để đặt quyền trên các tệp được sao chép sau khi tải lên.

Nếu không, tôi nghĩ lựa chọn duy nhất của bạn là thực thi một chmod trên máy chủ sau khi tải lên, điều mà bạn có thể thực hiện từ xa bằng lệnh ssh:

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

Tôi cũng nghĩ về điều đó, vậy còn việc tải lên các thư mục thì sao?
Florian Mayer

Hừm, tôi có thể làm chmod -R rồi. Tôi đoán không phải là một ý tưởng tồi.
Florian Mayer

1
Đúng. scp -r, sau đó ssh chmod -R
zigdon

1
Tôi cũng đã thành công khi làm điều tương tự với plink và pscp (từ gói putty)
stevepastelan

22

Giải pháp làm việc ưa thích của tôi sẽ là sử dụng rsyncthay thế:

Thay thế:

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

Với:

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

Điều này ngăn bạn xác thực hai lần. Ngoài ra còn có rất nhiều tùy chọn khác với rsync có thể sẽ tăng thêm giá trị như có thể bảo vệ chủ sở hữu, nhóm, v.v.


Đây không phải là làm việc.
soham

1
Tìm ra nguyên nhân. Bạn phải sử dụng --permslà tốt. Giải thích về từ khóa
soham

5
Bạn có thể hiển thị đầy đủ, hợp lệ, lệnh, pelase? Hoặc là nhận xét hoặc bằng cách chỉnh sửa câu trả lời
Mawg

6

Tôi đã thực hiện một số thí nghiệm với scp. Đối với các tệp mới được tải lên máy chủ đích, các tệp có quyền tương tự như trên máy chủ nguồn. Nếu các tệp hiện có bị ghi đè trên máy chủ đích, quyền cho các tệp đó không thay đổi.

Tôi đã thực hiện những thí nghiệm này với CentOS 4.6.


3
Đây phải là một nhận xét thay vì một câu trả lời
Jaime Hablutzel

2
Agred (nhưng nó thực sự có ích ;-)
Mawg

Đây là những gì tôi đang cố gắng thực hiện trong một lần thông qua kịch bản. Rsync không phải lúc nào cũng có trên máy chủ đích và đúng hơn là tập lệnh tôi đưa ra không có quyền tự do với apt / yum, v.v. để cài đặt rsync. Có vẻ như tôi có thể phải sử dụng phương pháp scp + chmod hoặc rm + scp để đảm bảo quyền là chính xác. : - /
zaTricky

5

Bạn có thể làm điều đó bằng cách sử dụng tar, ssh và umask như thế này:

trên máy chủ 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

trên máy chủ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

Bạn có thể thả các công tắc -v thành tar mà tôi đã đưa vào đây chỉ để bạn có thể thấy các tệp được trích xuất trên host1 và được gửi qua STDOUT (còn gọi là - -) và sau đó nhận được hủy tar trên host2.

LƯU Ý: Tại sao điều này hoạt động? Hành vi mặc định của Tar là giải nén các tệp bằng cách sử dụng ô của người dùng từ xa. Trong ví dụ trên, chúng tôi đã bao gồm các lệnh umask để thiết lập một cách rõ ràng để một cái gì đó khác nhau mà chứng tỏ rằng tar từ xa đang thay đổi các điều khoản ở phía xa.


1
Như tôi có thể thấy với lệnh này, bạn chỉ có thể áp dụng ít quyền hơn cho các tệp được chuyển, vì umaskchỉ có quyền trừ, ví dụ: đối với tệp cục bộ 700mà bạn không thể nhận được tệp 755trong máy chủ đích, hoặc tôi sai?
Jaime Hablutzel

1
Hơn nữa, bạn cần sử dụng --no-same-permissionslần thứ hai tarnếu người dùng đích đã root, xem superuser.com/a/383801/89031
Jaime Hablutzel

@jaime - đó là chính xác, điều này sẽ chỉ cho phép bạn đặt umasktoàn bộ tập tin khi chúng được ghi vào máy chủ từ xa. Không có kiểm soát riêng lẻ cho các tập tin khác nhau. Tôi sẽ thường sử dụng điều này vì tôi muốn loại bỏ các quyền thoải mái trên máy tính xách tay của tôi, ví dụ như khi sao chép vào một triển khai từ xa.
slm

@jaime - --no-same-permissionscũng đúng theo tartrang của người đàn ông. Tôi đã thay đổi lời nhắc trong ví dụ của mình để không có sự nhầm lẫn về điều đó.
slm

3

Tôi đã viết một đoạn script nhỏ cho tác vụ trong Python. Bạn có thể thực hiện python script.py -p o + r một số tệp một số / 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)

3
Bạn có nhớ đăng mã của bạn tại Code Review . Có thể có những gợi ý tốt đẹp về cách nó có thể được cải thiện.
tshepang

1
Ồ, tôi chưa bao giờ nghe nói về trang web SO mới, Code Review, ty @Tshepang!
AnneTheAgile

2
@AnneTheAgile nó không phải là mới; nó đã hơn 3 tuổi :)
tshepang

1

Tôi sẽ đề nghị thiết lập bit dính trên thư mục để các tệp bạn tải lên trong thư mục đó được tự động cho phép.

chmod 1644 dir

"1" được sử dụng ở trên thiết lập bit dính.

vì vậy bạn chỉ phải tải lên một và không phải chạy lệnh khác sau đó.


Ai đó có thể giải thích làm thế nào điều này sẽ làm việc, xin vui lòng?
Mawg

0

Giả sử bạn đang tải lên một biến thể UNIX, tôi nghĩ rằng các quyền phải tuân theo các cài đặt UMASK của bạn. Tôi không nhớ lại phần đầu của mình mà các tệp chấm được xử lý cho SCP, nhưng nếu bạn đặt UMASK của bạn ở một trong những tệp bạn tạo sẽ có quyền được đặt dựa trên nó. Nó có thể phụ thuộc vào loại vỏ bạn sử dụng trên hệ thống từ xa.

Dù bạn làm gì, đừng sử dụng tùy chọn -p vì nó hoàn toàn ngược lại với những gì bạn muốn.


Không. -p không phải là thứ tôi muốn vì tôi cần các quyền khác nhau trên máy chủ (vâng, đó là UNIX) so với máy cục bộ của tôi. Tất nhiên tôi có thể chmod chúng, sử dụng -p và sau đó chmod chúng lại, mặc dù sau đó tôi cần lưu trữ các quyền.
Florian Mayer

Tôi không gợi ý rằng bạn sử dụng -p, chỉ cần xác nhận rằng bạn là. Tôi sẽ làm rõ bài viết của tôi.
tvanfosson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.