使用scp上传时更改权限


44

我正在使用scp将文件上传到我的Shell帐户。由于我在服务器上需要的权限与在计算机上需要的权限不同,因此我希望有一种方法可以轻松地在上载时更改权限,而无需SSH到帐户并手动更改它们。

Answers:


29

如果要从Windows计算机复制,则可以使用WinSCP进行复制,并且可以选择在上传后设置复制文件的权限。

如果没有,我认为您唯一的选择是在上传后在服务器上执行chmod,您可以使用ssh命令远程执行此操作:

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

我也考虑过,那么上传目录呢?
弗洛里安·梅耶

嗯,那我可以做chmod -R。我猜这不是一个坏主意。
弗洛里安·梅耶

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还有很多其他选项,它们可能会增加价值,例如能够保留所有者,组等。


这是行不通的。
瑟汉姆

1
找出原因。您也必须使用--permsexplainshell.com/...
soham

5
您能显示完整,有效的命令吗?作为评论,或通过编辑答案
Mawg '16

6

我用scp做过一些实验。对于上载到目标服务器的新文件,这些文件具有与源服务器相同的权限。如果目标服务器上的现有文件被覆盖,则这些文件的权限不会更改。

我已经使用CentOS 4.6进行了这些实验。


3
这应该是评论而不是答案
Jaime Hablutzel 2014年

2
同意(但确实有帮助;-)
Mawg

这就是我想通过脚本一次性解决的问题。Rsync并不总是在目标服务器上,我宁愿我给出的脚本不带有apt / yum等安装rsync的自由。似乎我可能必须使用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(仅包含在此处)中,以便可以看到文件已在host1上存档,并通过STDOUT(又称为-)发送,然后在host2上未存档。

注意:为什么这样有效?Tar的默认行为是使用远程用户的umask解压缩文件。在上面的示例中,我包含了命令umask来将其显式设置为其他值,这表明远程tar正在更改远程端的权限。


1
正如我在此命令中看到的那样,您只能对传输的文件应用较少的权限,因为umask只能减去权限,例如对于本地文件,700您无法755在目标服务器中获取文件,还是我错了?
Jaime Hablutzel 2014年

1
此外--no-same-permissionstar如果目标用户是root用户,则需要第二次使用,请参阅superuser.com/a/383801/89031
Jaime Hablutzel 2014年

@jaime-正确,这将只允许您在将umask整个文件集写入远程服务器时设置它们。没有针对不同文件的单独控件。我经常会用到它,因为例如在复制到远程部署时,我想剥离在笔记本电脑上可以使用的宽松权限。
slm 2014年

@jaime- --no-same-permissions根据tar的手册页也是正确的。我已经更改了示例中的提示,因此没有混淆。
slm 2014年

3

我使用Python为该任务编写了一个小脚本。您可以执行python script.py -p o + r一些文件some / 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
你介意张贴代码代码审查。那里可能有很好的建议,关于如何进行改进。
tshepang 2011年

1
哇,我从未听说过新的SO网站Code Review,例如@Tshepang!
AnneTheAgile 2014年

2
@AnneTheAgile并不是那么新;它已经3岁了:)
tshepang

1

我建议在文件夹上设置粘性位,以便您在该文件夹下上传的文件自动获得该权限。

chmod 1644目录

上面使用的“ 1”设置粘性位。

因此,您只需要上传一个,而不必随后再运行另一个命令。


有人可以解释一下如何工作吗?
Mawg

0

假设您要上载到UNIX变体,则我认为权限应该遵循您的UMASK设置。我不记得要为SCP处理哪些点文件,但是如果将UMASK设置为其中一个文件,则将基于该文件设置权限。这可能取决于您在远程系统上使用的外壳。

无论您做什么,都不要使用-p选项,因为它与您想要的完全相反。


不。-p不是我想要的,因为我需要在服务器(是UNIX)上的权限与在本地计算机上的权限不同。我当然可以chmod它们,使用-p然后再chmod它们,尽管我那时需要存储权限。
弗洛里安·梅耶

我并不是在建议您使用-p,只是确认您使用了-p。我会澄清我的帖子。
tvanfosson,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.