使用scp传输文件夹与文件时如何即时修改目标端所有权
scp传输文件夹与文件时如何即时修改目标端所有权
嗨,这个问题我之前也碰到过,每次传完文件还要手动改所有权,确实挺折腾的!不过有两个靠谱的办法能帮你在传输过程中直接搞定这个事儿,不用事后再操作:
方法一:用rsync替代scp(最推荐)
rsync比scp更灵活,自带了修改目标文件所有权的参数,用起来特别省心。你只需要把原来的scp命令换成类似这样的rsync命令就行:
rsync -avz --chown=srv2:srv2 /var/www/vhosts/srv1.com/httpdocs/profile_image root@777.777.777.77:/var/www/vhosts/srv2.com/httpdocs
这里简单解释下参数:
-a:归档模式,会保留源文件的权限、时间戳等信息,同时递归传输文件夹-v:显示详细的传输过程,方便你看进度-z:传输时压缩数据,节省带宽--chown=srv2:srv2:直接指定目标文件/文件夹的所有者和所属组为srv2,传输完成后自动生效
方法二:结合tar+ssh管道(必须用scp场景下的替代方案)
如果你因为某些原因必须用scp相关的逻辑,也可以用tar打包后通过ssh管道传输,在目标端解压时直接指定所有权。命令如下:
tar -cf - /var/www/vhosts/srv1.com/httpdocs/profile_image | ssh root@777.777.777.77 "tar -xf - -C /var/www/vhosts/srv2.com/httpdocs --owner=srv2 --group=srv2"
这个命令的逻辑是:
- 本地用
tar -cf -把要传输的文件夹打包,输出到标准输出(-代表标准输出) - 通过管道把打包的数据传给目标端的ssh连接
- 目标端用
tar -xf -读取标准输入的打包数据,-C指定解压到目标目录,同时用--owner和--group强制设置所有权为srv2
需要注意的是,目标端执行tar命令的用户(这里是root)必须有修改目标目录所有权的权限,不然会报错哦。
另外提一句:scp本身默认是保留源文件的所有权信息的,除非目标服务器上刚好有和源端srv1相同UID的用户,不然就会显示srv1的用户名(或者对应的UID数字),所以它本身没有直接修改所有权的参数,这也是为什么我们需要用上面两种办法来替代~
备注:内容来源于stack exchange,提问作者user19559647
相关产品推荐
相关产品推荐

