AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 38784
Accepted
Kamil Kisiel
Kamil Kisiel
Asked: 2009-07-10 22:48:41 +0800 CST2009-07-10 22:48:41 +0800 CST 2009-07-10 22:48:41 +0800 CST

如何将 ZFS ACL 从一个文件克隆到另一个文件?

  • 772

我想将所有 ZFS ACL 从一个文件克隆到另一个文件。

使用 POSIX ACL,这可以通过管道输出getfaclto 来完成setfacl。

ZFS 中的 NFSv4 样式 ACL 是否有一种简单快捷的方法来执行此操作?我知道我可以读取 的输出,ls -lV然后将其作为 a 的一部分输入chmod,但我似乎找不到与复制 ACL 的 POSIX 方式等效的功能。

solaris access-control-list zfs
  • 4 4 个回答
  • 3577 Views

4 个回答

  • Voted
  1. Best Answer
    Martin
    2009-07-18T02:45:14+08:002009-07-18T02:45:14+08:00

    ls -lV您可以使用which代替使用ls -lv,可以将其输入脚本以将其转换为chmod命令序列以复制 ACL。

    例如,如果 ACl 看起来像这样:

    $ ls -lv file1
         0:owner@::deny
         1:owner@:read_data/write_data/append_data/write_xattr/execute
             /write_attributes/write_acl/write_owner:allow
         2:group@:read_data/write_data/append_data:deny
         3:group@:execute:allow
         4:everyone@:read_data/write_data/append_data/write_xattr
            /write_attributes/write_acl/write_owner:deny
         5:everyone@:read_xattr/execute/read_attributes/read_acl/synchronize:allow
    

    它应该变成以下chmod命令序列:

    chmod A0=owner@::deny file2
    chmod A1=owner@:read_data/write_data/append_data/write_xattr/execute/write_attributes/write_acl/write_owner:allow file2
    chmod A2=group@:read_data/write_data/append_data:deny file2
    chmod A3=group@:execute:allow file2
    chmod A4=everyone@:read_data/write_data/append_data/write_xattr/write_attributes/write_acl/write_owner:deny file2
    chmod A5=everyone@:read_xattr/execute/read_attributes/read_acl/synchronize:allow file2
    

    我最近发现自己遇到了一种情况,上面描述的脚本会很有用,所以这是我制作的一个小 Bash 脚本(也可以来自 shell 并作为函数运行)来打印必要的 chmod 命令列表将 ZFS ACL 从一个文件复制到另一个文件:

    #!/bin/bash
    
    acl_as_chmods () {
    # 打印 chmod 命令列表以将 ACL 条目从“$1”复制到“$2”
     [[ -a "$1" ]] 2>/dev/null || {
       echo "需要有效的参考文件。" >&2
       返回 1
     }
     ls -vd "$1" | {
       read #第一行不是ACL信息;旁路
       读取 ACL_entry
         echo -n "chmod A=${ACL_entry#*:}"
       # 如果没有将目标文件指定为“$2”,则在运行时使用“TARGET”变量
       同时读取 ACL_entry || {回声“${2-\$TARGET}”;错误的; }
       做
         [[ "$ACL_entry" == [0-9]*:* ]] && \
           echo -en " ${2-\$TARGET}\nchmod A${ACL_entry%%:*}+${ACL_entry#*:}" || \
           echo -n "$ACL_entry"
       完毕
     }
    }
    
    ## 作为脚本或源函数运行到 shell?
    __acl_as_chmods () {
     [[ "${FUNCNAME[1]}" == "源" ]] || acl_as_chmods "$@"
    }
    
    __acl_as_chmods "$@"
    

    以下是上面file1的几个示例用法及其输出:

    ~$ ./acl_as_chmods.sh 文件1 文件2
    chmod A=owner@::deny file2
    chmod A1+owner@:read_data/write_data/append_data/write_xattr/execute/write_attributes/write_acl/write_owner:allow file2
    chmod A2+group@:read_data/write_data/append_data:deny file2
    chmod A3+group@:execute:allow file2
    chmod A4+everyone@:read_data/write_data/append_data/write_xattr/write_attributes/write_acl/write_owner:deny file2
    chmod A5+everyone@:read_xattr/execute/read_attributes/read_acl/synchronize:allow file2
    
    ~$ 源 acl_as_chmods.sh
    ~$ acl_as_chmods 文件1
    chmod A=owner@::deny $TARGET
    chmod A1+owner@:read_data/write_data/append_data/write_xattr/execute/write_attributes/write_acl/write_owner:allow $TARGET
    chmod A2+group@:read_data/write_data/append_data:deny $TARGET
    chmod A3+group@:execute:allow $TARGET
    chmod A4+everyone@:read_data/write_data/append_data/write_xattr/write_attributes/write_acl/write_owner:deny $TARGET
    chmod A5+everyone@:read_xattr/execute/read_attributes/read_acl/synchronize:allow $TARGET
    

    如果我们愿意,我们甚至可以直接评估这些 chmod,如果这两个文件都可以在此主机上访问并且我们希望立即将 ACL 从file1复制到file2:

    ~$ ls -Vd 文件* #之前
    -rwx--x--x 1 用户用户 0 Jun 19 04:12 file1
                所有者@:-------------:------:拒绝
                owner@:rwxp---AW-Co-:------:允许
                group@:rw-p----------:------:拒绝
                组@:--x-----------:------:允许
             所有人@:rw-p---AW-Co-:------:拒绝
             大家@:--x---aRc--s:------:allow
    ---x--------+ 1 个用户用户 0 Jun 19 04:12 file2
                所有者@:--x------------:------:允许
    
    ~$ eval "$(acl_as_chmods file1 file2)"
    
    ~$ ls -Vd 文件* #AFTER
    -rwx--x--x 1 用户用户 0 Jun 19 04:12 file1
                所有者@:-------------:------:拒绝
                owner@:rwxp---AW-Co-:------:允许
                group@:rw-p----------:------:拒绝
                组@:--x-----------:------:允许
             所有人@:rw-p---AW-Co-:------:拒绝
             大家@:--x---aRc--s:------:allow
    -rwx--x--x 1 用户用户 0 Jun 19 04:12 file2
                所有者@:-------------:------:拒绝
                owner@:rwxp---AW-Co-:------:允许
                group@:rw-p----------:------:拒绝
                组@:--x-----------:------:允许
             所有人@:rw-p---AW-Co-:------:拒绝
             大家@:--x---aRc--s:------:allow
    
    • 6
  2. clee
    2011-06-12T14:29:37+08:002011-06-12T14:29:37+08:00

    我遇到了同样的问题。我的代码在这里:

    https://gist.github.com/1021032

    对我来说就像一个魅力。如果那里的其他人遇到这个问题,希望它很方便。

    • 3
  3. dlamblin
    2009-08-04T13:38:04+08:002009-08-04T13:38:04+08:00

    采用Martin的建议并应用一些 perl,您可能会得到类似的结果:

    #!/usr/bin/perl
    use warnings;
    use strict;
    
    my $state = 0;
    if ($#ARGV < 1 || $#ARGV > 2) {
      print "\n\tUsage: $0 srcFile destFile\n";
    }
    my $acl=`ls -lv "${ARGV[0]}"`;
    my @out="chmod", "arg", $ARGV[1];
    foreach my $line ($acl) {
      chomp $line;
      if ($line =~ m/^\s+(\d+):(.*)$/) {
        if ($state > 0) {
          print join(" ",@out)."\n";
          #system(@out) or die "system @args failed: $?";
        }
        $state = 1;
        $out[1] = "A$1=$2";
      } else {
        $line =~ m/^\s+(.*)$/;
        $state = 2;
        $out[1] .= $1;
      }
    }
    if ($state > 0) {
      print join(" ",@out)."\n";
      #system(@out) or die "system @args failed: $?";
    }
    

    在取消注释系统(@out)行之前尝试一下。

    • 1
  4. Morven
    2009-09-18T12:37:25+08:002009-09-18T12:37:25+08:00

    令人讨厌的是,这似乎没有在外壳级别正确公开。在 C 语言中,有一些函数可用于从一个文件中获取 ACL 并将其应用于另一个文件(显然还有其他选项)acl_get(3SEC)。acl_set(3SEC)他们还将有用地将 ACL 从 POSIX 草案转换为 NFSv4 类型;这就是系统命令喜欢mv和cp使用的。

    我曾经使用这种技术编写了一个将 acl 从源文件复制到目标文件的命令,但我目前找不到源代码。如果我找到它,我会将它附加到这个答案中。

    • 1

相关问题

  • Solaris DNS

  • 在 solaris 10 上为 mysql 设置 max_allowed_pa​​cket

  • 如何在 OpenSolaris 的控制台上使用 Dvorak?

  • ssh 会话空闲超时

  • AD 世界中的 Solaris 10 身份验证

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve