我使用/etc/auto.mymount在CentOS上configuration了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装载一样。 所以我查看了当前cifs-utils代码中的mount.cifs.c源文件,该文件应该是6.3版本的。 读取密码的代码不会消除,除非每个逗号在parsed_mount_info结构的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()读取的=符号和行尾之间的所有内容都被复制到密码字段中。 (在复制之前,换行符被空字节替代)。但是对于其他设置密码的方法(如环境variables,选项或stdin),调用相同的例程,因此如果从命令行装入卷,这个逗号翻倍并不是罪魁祸首。
但是,如果任何行包含尾随空格,或者您的凭证文件具有非UNIX行结尾,则可能会遇到麻烦。 跟踪的CR将被读作密码的一部分,其他尾随的空格也是如此。 同样,如果您的密码包含任何非ASCII字符(读取文件的编码很重要),则读取密码可能会失败。
TL,DR:
你可能在文件中有任何空格,也许在=符号之间? 按照以下链接,可能会由于creds文件中的空格导致-13错误。 http://thinkinginsoftware.blogspot.com/2011/09/cifs-vfs-cifsmount-failed-return-code.html
我自己的想法也想知道这是否是由于文件本身的编码问题。 file -bi /etc/auto.creds.svc_account返回什么? 也许有一个stream浪的控制angular色? 什么用vim打开文件并运行:set list show? 也许这不是以前的问题,因为编码只用于“炸毁”某些字符,而这些字符到目前为止还不存在于密码中。 解决这个问题的最简单的方法是重新创build文件并再次尝试,或者将旧的工作密码与新的密码进行比较,并确定可能引入了哪些新的特殊字符。
我不知道这样回答是否太迟了,但是对于其他任何有这个问题的人来说,我只是用一个CentOS6虚拟机试图访问Windows 7主机上的cifs共享, 。
最后,我的工作是更改凭证文件中的密码行以使用“传递”作为参数名称。 例如
user=myUserName domain=MYDOMAIN pass=myStrongPasswordWithSpecialCharacters
我不知道是否有关密码中的特殊字符的东西搞砸了文件parsing时,但我注意到,用户名和密码被parsing为用户和通过,所以决定通过直接把这些值在文件中。
希望这有助于某人。
您应该能够使用ASCII码来表示特殊字符,例如:
SPACE = \040 AMPERSAND = \046
请在这里查询ASCII表格: http : //www.asciitable.com/
解决scheme可在以下urlfind: http : //www.linuxforums.org/forum/ubuntu-linux/175662-solved-fstab-special-characters.html