我已经使用/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字符(如变音符号)>检查它是否适用于没有逗号的密码(它确实不应该有所作为,但谁知道)