Ste*_*eve 6 linux centos autofs
我已经在 CentOS 上使用/etc/auto.mymount
. 像这样的东西:
mymount -fstype=cifs,rw,noperm,credentials=/etc/auto.creds.svc_account ://winserver.domain.local/SharedFolder
Run Code Online (Sandbox Code Playgroud)
这一直在工作,并且仍然适用于某些坐骑。但是,用于连接到 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
Run Code Online (Sandbox Code Playgroud)
显然我已经更改了上面的密码,但它确实包含真实密码中的各种非字母数字字符。
查看/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
Run Code Online (Sandbox Code Playgroud)
鉴于唯一改变的是密码,我猜测那里有需要以某种方式转义的特殊字符。
现在我知道,如果我将该密码放入命令行,那么命令将由于各种特殊字符而失败,可以通过在每个特殊字符前加上反斜杠来处理。例如:
password=AbCd@a\;abc{\`B\"[C\\\\~/fg9w\(G\':4##abC}d3.H}v,2]f+c
Run Code Online (Sandbox Code Playgroud)
但这不起作用,所以很明显我错过了一些东西。有人能够解释需要在凭据文件中转义哪些字符以及转义它们的正确方法吗?
我想凭据文件将由 读取mount.cifs
,就像其他 CIFS 安装一样。所以我查看了当前 cifs-utils 代码中的mount.cifs.c
源文件,它应该是 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;
}
Run Code Online (Sandbox Code Playgroud)
如果是凭据文件,则src
指向=
符号后面密码行中的位置。=
读取的符号和行尾之间的所有内容都fgets()
被复制到密码字段中。(在复制之前,换行符被空字节替换。)但是对于设置密码的所有其他方式,如环境变量、选项或标准输入,都会调用相同的例程,因此如果从命令行安装卷,逗号加倍不是罪魁祸首。
但是,如果任何行包含尾随空格或您的凭据文件具有非 UNIX 行结尾,您可能会遇到麻烦。尾随 CR 将作为密码的一部分被读取,其他尾随空格也是如此。同样,如果您的密码包含任何非 ASCII 字符,则读取密码可能会失败,其中文件的编码很重要。
TL,博士: