He configurado autofs en CentOS usando /etc/auto.mymount
. Algo como esto:
mymount -fstype=cifs,rw,noperm,credentials=/etc/auto.creds.svc_account ://winserver.domain.local/SharedFolder
Esto ha estado funcionando y todavía funciona para algunas monturas. Sin embargo, se ha cambiado una contraseña para una cuenta que se utiliza para conectarse a un servidor de Windows y ahora contiene todo tipo de caracteres especiales. Mi archivo de credenciales /etc/auto.creds.svc_account
se parece un poco a esto:
username=svc_account
password=AbCd@a;abc{`B"[C\\~/fg9w(G':4##abC}d3.H}v,2]f+c
Obviamente cambié la contraseña anterior, pero contiene varios caracteres no alfanuméricos que se encuentran en la contraseña real.
Mirando en /var/log/messages, veo lo siguiente:
Status code returned 0xc000006d NT_STATUS_LOGON_FAILURE
CIFS VFS: Send error in SessSetup = -13
CIFS VFS: cifs_mount failed w/return code = -13
Dado que lo único que ha cambiado es la contraseña, supongo que hay caracteres especiales allí que deben escaparse de alguna manera.
Ahora sé que si pongo esa contraseña en la línea de comando, los comandos fallarán debido a los diversos caracteres especiales, que pueden solucionarse precediendo a cada uno de ellos con una barra invertida. Por ejemplo:
password=AbCd@a\;abc{\`B\"[C\\\\~/fg9w\(G\':4##abC}d3.H}v,2]f+c
Pero eso no funcionó, así que claramente me estoy perdiendo algo. ¿Alguien puede explicar qué caracteres deben escaparse en un archivo de credenciales y la forma correcta de escapar de ellos?
Respuesta1
Supongo que el archivo de credenciales será leído por mount.cifs
, como ocurre con otros montajes CIFS. Así que eché un vistazoel mount.cifs.c
archivo fuente en el código cifs-utils actual, que debería ser para la versión 6.3. Elcódigo para leer la contraseñano elimina el escape, excepto que cada coma se duplica en el password
campo de la parsed_mount_info
estructura, como aparentemente es necesario al ensamblar los parámetros para la mount(2)
llamada:
/*
* 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;
}
En el caso de un archivo de credenciales, src
señala la posición en la línea de contraseña justo detrás del =
signo. Todo lo =
leído entre el signo y el final de la línea fgets()
se copia en el campo de contraseña. (La nueva línea se reemplaza por un byte nulo antes de copiar). Pero para cualquier otra forma de establecer una contraseña, como variables de entorno, opciones o desde stdin, se llama a la misma rutina, por lo que si montar el volumen funciona desde la línea de comando, esa duplicación de coma no es la culpable.
Sin embargo, podría tener problemas si alguna línea contiene espacios en blanco al final o si su archivo de credenciales tiene finales de línea que no son UNIX. Un CR final se leería como parte de la contraseña, al igual que otros espacios en blanco finales. De manera similar, la lectura de la contraseña podría fallar si su contraseña contiene caracteres que no sean ASCII, donde la codificación del archivo sería importante.
TL,DR:
- No es necesario escapar nada en la contraseña.
- Compruebe si montar el volumen CIFS funciona desde la línea de comando
- Compruebe si hay espacios en blanco al final de la línea de contraseña
- Compruebe si su archivo de credenciales tiene formato UNIX y no tiene finales de línea DOS
- Compruebe si hay caracteres que no sean ASCII (como diéresis) en la contraseña
- Comprueba si funciona con una contraseña sin comas (realmente no debería hacer ninguna diferencia, pero quién sabe)
Respuesta2
¿Es posible que tenga espacios en el archivo, quizás entre los =
carteles? un -13
error puede deberse a espacios en el archivo creds, según el siguiente enlace. http://thinkinginsoftware.blogspot.com/2011/09/cifs-vfs-cifsmount-failed-return-code.html
Mi propio pensamiento también se pregunta si esto podría deberse a un problema de codificación con el archivo en sí. ¿Qué file -bi /etc/auto.creds.svc_account
regresa? ¿Quizás hay un personaje de control extraviado? ¿Qué muestra abrir el archivo con vim y ejecutarlo :set list
? Quizás antes no era un problema porque la codificación utilizada sólo "explota" ciertos caracteres que no estaban presentes en la contraseña hasta ahora. La forma más sencilla de solucionar este problema sería volver a crear el archivo e intentarlo de nuevo, o comparar la contraseña anterior con la nueva y determinar qué nuevos caracteres especiales se pueden haber introducido.
Respuesta3
No sé si es demasiado tarde para responder esto, pero para cualquiera que tenga este problema, pasé un par de horas golpeándome la cabeza contra la pared con una máquina virtual CentOS6 intentando acceder a recursos compartidos cifs en el host de Windows 7. .
Al final, lo que funcionó para mí fue cambiar la línea de contraseña en el archivo de credenciales para usar "contraseña" como nombre de parámetro. p.ej
user=myUserName
domain=MYDOMAIN
pass=myStrongPasswordWithSpecialCharacters
No sé si algo relacionado con los caracteres especiales en la contraseña estropeó algo cuando se analizó el archivo, pero noté que el nombre de usuario y la contraseña se estaban analizando como usuario y contraseña, así que decidí eliminar ese paso poniendo esos valores directamente. en el archivo.
Espero que esto ayude a alguien.
Respuesta4
Debería poder utilizar códigos ASCII octales para caracteres especiales, por ejemplo:
SPACE = \040
AMPERSAND = \046
Consulta la tabla ASCII aquí:http://www.asciitable.com/
Solución encontrada en:http://www.linuxforums.org/forum/ubuntu-linux/175662-solved-fstab-special-characters.html