我正在使用 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)