【问题标题】:How to copy only file permissions and user:group from one machine and apply them on another machine in linux?如何仅从一台机器复制文件权限和用户:组并将它们应用到 linux 的另一台机器上?
【发布时间】:2013-08-26 06:11:53
【问题描述】:

我有一个存储在文本文件中的文件列表(文件/文件夹的绝对路径)。我只需要从一台机器复制权限、用户:组属性(所有这些文件的),并在另一台机器上的同一组文件上应用相同的设置。

我能想到的一种方法是逐个手动完成,通过检查一台机器上的属性并逐个文件在另一台机器上执行 chmod/chown,但这似乎是一项乏味的任务。

知道如何自动执行此操作吗?

编辑:只是想明确一点,我不需要源机器中这些文件的数据,因为源机器中的数据不同。目标机器包含更新的数据,我现在只需要源机器的文件/文件夹权限和用户:组。

【问题讨论】:

标签: shell file-permissions


【解决方案1】:

这个怎么样?

#!/bin/bash

user="user"
host="remote_host"

while read file
do
    permission=$(stat -c %a $file) # retrieve permission
    owner=$(stat -c %U $file) # retrieve owner
    group=$(stat -c %G $file) # retrieve group

    # just for debugging
    echo "$file@local: p = $permission, o = $owner, g = $group"

    # copy the permission
    ssh $user@$host "chmod $permission $file" < /dev/null 

    # copy both owner and group
    ssh $user@$host "chown $owner:$group $file" < /dev/null

done < list.txt

我假设文件列表保存在“list.txt”中。

此外,您应该根据您的设置设置变量“user”和“host”。

我建议将 ssh 配置为“自动登录”。否则你应该插入 每个循环输入两次密码。这里有一个很好的教程来做到这一点SSH login without password

另一种仅建立一个 ssh 连接并使用递归选项的解决方案 对于目录(如 cmets 中所要求的)如下:

#!/bin/bash

user="user"
host="remote_host"

cat list.txt | xargs stat -c "%n %a %U:%G" | ssh $user@$host '
while read file chmod_par chown_par 
do
    # $file contains %n
    # $chmod_par contains %a
    # $chown_par contains %U:%G

    if [ -d $file ]; then
            chmod -R $chmod_par $file
            chown -R $chown_par $file
    else
            chmod $chmod_par $file
            chown $chown_par $file  
    fi
done'

【讨论】:

  • +1。非常感谢您的回答。真的很有帮助。我需要稍微修改一下以区分文件和目录。对于目录,我必须添加 -R。
  • 我想到的另一点是,不要对每个文件都做 ssh。让我们在一个临时脚本文件中写入 chmod 和 chown 并在目标机器上传输和执行该脚本。这样做我们最多需要提供两次密码,一次用于 scp,另一次用于 ssh。希望它会改进一点。
  • 你完全正确。第一个解决方案虽然很容易理解,但效率不高。第二个应该更快。如果您的文件/目录集足够大并且您有时间,我很想知道第二个版本对第一个版本的改进。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多