使用 scp 上传时更改权限

使用 scp 上传时更改权限

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

答案1

如果你从 Windows 机器复制,你可以使用温SCP进行复制,并且可以选择在上传后设置所复制文件的权限。

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

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

答案2

我的首选工作解决方案是使用rsync

代替:

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

和:

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

这可以防止您进行两次身份验证。还有许多其他选项同步这可能会增加价值,例如能够保留所有者、群组等。

答案3

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

我已经使用 CentOS 4.6 完成了这些实验。

答案4

我用 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)

相关内容