Câu trả lời:
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
Giải pháp làm việc ưa thích của tôi sẽ là sử dụng rsync
thay 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.
--perms
là tốt. Giải thích về từ khóa
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.
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.
umask
chỉ có quyền trừ, ví dụ: đối với tệp cục bộ 700
mà bạn không thể nhận được tệp 755
trong máy chủ đích, hoặc tôi sai?
--no-same-permissions
lần thứ hai tar
nếu người dùng đích đã root, xem superuser.com/a/383801/89031
umask
toà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.
--no-same-permissions
cũng đúng theo tar
trang 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 đó.
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)
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 đó.
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.