在 GNU 屏幕上转储/显示 ACL

在 GNU 屏幕上转储/显示 ACL

我正在尝试制作一个界面,以便更容易在屏幕上设置 ACL。设置 ACL 相当容易,但是,我找不到显示或转储现有 ACL 的方法。查看此列表的存档后,我发现我不是唯一一个遇到这种情况的人。但是,上一个问题关于这个问题似乎从来没有得到答复。

目前有没有办法在屏幕上看到现有的 ACL?更好的是,有没有办法将它们转储到文件/标准输出?

答案1

根据本指南介绍多用户屏幕,目前没有 Screen 内部 ACL 的接口。这与屏幕手册;既不是命令也不多用户会话部分提供任何其他与 ACL 相关的命令。以下是完整列表:

  • 阿克拉德- 添加对所有窗口具有完全权限的用户。
  • 離開- 添加具有更灵活权限的用户或更改现有用户的权限。
  • 阿克德尔- 将用户从屏幕知识中移除。
  • 访问控制组- 将用户添加到组或仅描述用户的组成员身份。
  • 阿克拉马斯克- 为尚未创建的窗口设置默认权限。
  • 清除- 与 Esc 类似,但为所有用户设置命令字符。
  • 写锁- 为新窗口设置默认的写锁设置。
  • 多用户- 启用或禁用多用户模式。
  • - 以不同的用户身份进行操作。
  • 写锁- 为当前窗口设置写锁模式。

我不熟悉 Screen 的内部结构,但如果你想以这些命令允许的方式以外的方式访问 Screen ACL,你需要检查来源直接。您的项目听起来对 Screen 社区非常有益,所以我祝您实施顺利。


如果你看看src/acls.h,你会看到结构aclusergroupacluser;还有一个结构aclsrc/screen.h。这些是基本的数据结构;看起来屏幕 ACL 本质上是一个aclusergroup节点的链接列表,其中acluser节点包含大多数有趣的数据。

src/acls.c包含 ACL 操作代码;例如,acladdaclchg命令都由函数处理UserAcl()(第 864 行)。

该结构如下所示:

/* in screen.h */
struct acl
{
  struct acl *next;
  char *name;
};

/* in acls.h */
/*
 * How a user joins a group.
 * Here is the node to construct one list per user.
 */
struct aclusergroup
{
  struct acluser *u;                        /* the user who borrows us his rights */
  struct aclusergroup *next;
};

/* ... */

/*
 * A User has a list of groups, and points to other users.  
 * users is the User entry of the session owner (creator)
 * and anchors all other users. Add/Delete users there.
 */
typedef struct acluser
{
  struct acluser *u_next;                    /* continue the main user list */
  char u_name[20+1];                         /* login name how he showed up */
  char *u_password;                          /* his password (may be NullStr). */
  int  u_checkpassword;                      /* nonzero if this u_password is valid */
  int  u_detachwin;                          /* the window where he last detached */
  int  u_detachotherwin;                     /* window that was "other" when he detached */
  int  u_Esc, u_MetaEsc;                     /* the users screen escape character */
#ifdef COPY_PASTE
  struct plop u_plop;                        /* internal copy-paste buffer */
#endif
#ifdef MULTIUSER
  int u_id;                                  /* a uniq index in the bitfields. */
  AclBits u_umask_w_bits[ACL_BITS_PER_WIN];  /* his window create umask */
  struct aclusergroup *u_group;              /* linked list of pointers to other users */
#endif
} User;

使用 screen 进行编译时似乎包含了 ACL 代码MULTIUSER(虽然我不确定它是在命令行还是在其他头文件中定义),因此搜索该关键字可以帮助您找到特定的多用户代码。

相关内容