linux – autofs挂载凭证文件的正确转义是什么?

我已经使用/etc/auto.mymount在CentOS上配置了autofs.像这样的东西:
mymount -fstype=cifs,rw,noperm,credentials=/etc/auto.creds.svc_account ://winserver.domain.local/SharedFolder

对于一些坐骑来说,这一直在起作用.但是,用于连接到Windows服务器的帐户的密码已更改,现在包含各种特殊字符.我的凭证文件/etc/auto.creds.svc_account看起来有点像这样:

username=svc_account
password=AbCd@a;abc{`B"[C\\~/fg9w(G':4##abC}d3.H}v,2]f+c

显然我已经更改了上面的密码,但它确实包含真实密码中的各种非字母数字字符.

查看/ var / log / messages,我看到以下内容

Status code returned 0xc000006d NT_STATUS_logoN_FAILURE
CIFS VFS: Send error in SessSetup = -13
CIFS VFS: cifs_mount Failed w/return code = -13

鉴于唯一改变的是密码,我猜测那里有特殊字符需要以某种方式进行转义.

现在我知道如果我将该密码放入命令行,那么由于各种特殊字符,命令将会崩溃,可以通过在每个特殊字符前加上反斜杠来处理.例如:

password=AbCd@a\;abc{\`B\"[C\\\\~/fg9w\(G\':4##abC}d3.H}v,2]f+c

但这没用,所以显然我错过了一些东西.是否有人能够解释哪些字符需要在凭证文件中转义以及正确的方法来逃避它们?

解决方法

我想mount.cifs将读取凭证文件,就像其他CIFS挂载一样.所以我看了 the mount.cifs.c source file in the current cifs-utils code,应该是6.3版.除了每个逗号在parsed_mount_info结构的密码字段中加倍之外,code for reading the password没有任何转义,这在组装mount(2)调用的参数时显然是必要的:
/*
 * CIFS has to "escape" commas in the password field so that they don't
 * end up getting confused for option delimiters. copy password into pw
 * field,turning any commas into double commas.
 */
static int set_password(struct parsed_mount_info *parsed_info,const char *src)
{
    char *dst = parsed_info->password;
    unsigned int i = 0,j = 0;

    while (src[i]) {
        if (src[i] == ',')
            dst[j++] = ',';
        dst[j++] = src[i++];
        if (j > sizeof(parsed_info->password)) {
            fprintf(stderr,"Converted password too long!\n");
            return EX_USAGE;
        }
    }
    dst[j] = '\0';
    parsed_info->got_password = 1;
    return 0;
}

如果是凭证文件,则src指向密码行中位于=符号后面的位置.由fgets()读取的=符号和行尾之间的所有内容都将复制到密码字段中. (在复制之前,换行符被替换为空字节.)但是对于设置密码的所有其他方式,如环境变量,选项或stdin,调用相同的例程,因此如果从命令行安装卷,逗号加倍不是罪魁祸首.

但是,如果任何行包含尾随空格或您的凭证文件具有非UNIX行结尾,则可能会遇到麻烦.尾随CR将作为密码的一部分读取,其他尾随空格也将如此.同样,如果您的密码包含任何非ASCII字符,那么读取密码可能会失败,其中文件的编码很重要.

TL,DR:

>密码中不必转义任何内容>检查是否从命令行安装CIFS卷>检查密码行中的尾随空格>检查您的凭证文件是否具有UNIX格式且没有DOS行结局>在密码中检查非ASCII字符(如变音符号)>检查它是否适用于没有逗号的密码(它确实不应该有所作为,但谁知道)

相关文章

Linux中的ARP防火墙主要用于防御ARP欺骗攻击,其效果取决于多...
insmod和modprobe加-f参数导致Invalid module format错误 这...
将ArchLinux安装到U盘 几个月前入门Arch的时候上网搜了不少安...
1、安装Apache。 1)执行如下命令,安装Apache服务及其扩展包...
一、先说一下用ansible批量采集机器信息的实现办法: 1、先把...
安装配置 1. 安装vsftpd 检查是否安装了vsftpd # rpm -qa | ...