我正在使用scp将文件上传到我的Shell帐户。由于我在服务器上需要的权限与在计算机上需要的权限不同,因此我希望有一种方法可以轻松地在上载时更改权限,而无需SSH到帐户并手动更改它们。
我正在使用scp将文件上传到我的Shell帐户。由于我在服务器上需要的权限与在计算机上需要的权限不同,因此我希望有一种方法可以轻松地在上载时更改权限,而无需SSH到帐户并手动更改它们。
Answers:
如果要从Windows计算机复制,则可以使用WinSCP进行复制,并且可以选择在上传后设置复制文件的权限。
如果没有,我认为您唯一的选择是在上传后在服务器上执行chmod,您可以使用ssh命令远程执行此操作:
scp /path/to/file server:/server/path/to/file
ssh server chmod 644 /server/path/to/file
我首选的工作解决方案是改为使用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还有很多其他选项,它们可能会增加价值,例如能够保留所有者,组等。
--perms
。explainshell.com/...
我用scp做过一些实验。对于上载到目标服务器的新文件,这些文件具有与源服务器相同的权限。如果目标服务器上的现有文件被覆盖,则这些文件的权限不会更改。
我已经使用CentOS 4.6进行了这些实验。
您可以使用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正在更改远程端的权限。
umask
只能减去权限,例如对于本地文件,700
您无法755
在目标服务器中获取文件,还是我错了?
umask
整个文件集写入远程服务器时设置它们。没有针对不同文件的单独控件。我经常会用到它,因为例如在复制到远程部署时,我想剥离在笔记本电脑上可以使用的宽松权限。
--no-same-permissions
根据tar
的手册页也是正确的。我已经更改了示例中的提示,因此没有混淆。
我使用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)
我建议在文件夹上设置粘性位,以便您在该文件夹下上传的文件自动获得该权限。
chmod 1644目录
上面使用的“ 1”设置粘性位。
因此,您只需要上传一个,而不必随后再运行另一个命令。
假设您要上载到UNIX变体,则我认为权限应该遵循您的UMASK设置。我不记得要为SCP处理哪些点文件,但是如果将UMASK设置为其中一个文件,则将基于该文件设置权限。这可能取决于您在远程系统上使用的外壳。
无论您做什么,都不要使用-p选项,因为它与您想要的完全相反。