我在 CentOS 上使用 配置了 autofs /etc/auto.mymount
。类似这样的:
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
但那没有用,所以显然我遗漏了一些东西。有人能解释一下凭证文件中需要转义哪些字符以及正确的转义方法吗?
答案1
我猜想凭证文件将被读取mount.cifs
,就像其他 CIFS 安装一样。所以我查看了mount.cifs.c
当前 cifs-utils 代码中的源文件,应该是 6.3 版本。读取密码的代码没有进行转义,只是在结构体password
的字段中每个逗号都加倍parsed_mount_info
,这在组合调用参数时显然是必要的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 字符(如变音符号)
- 检查它是否适用于不带逗号的密码(实际上应该没有什么区别,但谁知道呢)
答案2
文件中是否有空格,也许在符号之间=
?-13
creds 文件中的空格可能会导致错误,如以下链接所示。 http://thinkinginsoftware.blogspot.com/2011/09/cifs-vfs-cifsmount-failed-return-code.html
我自己也在想,这是否可能是由于文件本身的编码问题造成的。file -bi /etc/auto.creds.svc_account
返回了什么?也许是有一个多余的控制字符?用 vim 打开文件并运行会:set list
显示什么?也许以前这不是问题,因为使用的编码只会在某些字符上“爆炸”,而这些字符直到现在才出现在密码中。解决此问题最简单的方法是重新创建文件并重试,或者将旧的工作密码与新密码进行比较,并确定可能引入了哪些新的特殊字符。
答案3
我不知道现在回答这个问题是否太晚了,但对于遇到此问题的任何人来说,我刚刚花了几个小时用 CentOS6 VM 尝试访问 Windows 7 主机上的 cifs 共享。
最后,对我有用的是更改凭证文件中的密码行以使用“pass”作为参数名称。例如
user=myUserName
domain=MYDOMAIN
pass=myStrongPasswordWithSpecialCharacters
我不知道在解析文件时密码中的特殊字符是否会造成问题,但我注意到用户名和密码被解析为用户和密码,因此决定通过将这些值直接放入文件中来省去该步骤。
希望这对某人有帮助。
答案4
您应该能够使用八进制 ASCII 代码来表示特殊字符,例如:
SPACE = \040
AMPERSAND = \046
请参阅此处的 ASCII 表:http://www.asciitable.com/
解决方案位于:http://www.linuxforums.org/forum/ubuntu-linux/175662-solved-fstab-special-characters.html