Я настроил autofs на CentOS, используя /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
Но это не сработало, так что явно что-то не хватает. Может ли кто-нибудь объяснить, какие символы необходимо экранировать в файле учетных данных и как правильно их избежать?
Я предполагаю, что файл учетных данных будет прочитан mount.cifs
, как и для других креплений CIFS. Итак, я взглянул на то mount.cifs.c
исходный файл в текущем коде cifs-utils, который должен быть для версии 6.3. В код для чтения пароля не выполняет отмену экранирования, за исключением того, что каждая запятая удваивается в password
поле parsed_mount_info
struct, что очевидно необходимо при сборке параметров для 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()
копируется в поле пароля. (Новая строка перед копированием заменяется нулевым байтом.) Но для любого другого способа установки пароля, например переменных среды, параметров или из стандартного ввода, вызывается та же процедура, поэтому, если монтирование тома выполняется из командной строки, это не удвоение запятой виновато.
Однако у вас могут возникнуть проблемы, если какая-либо строка содержит завершающие пробелы или ваш файл учетных данных имеет окончания строк, отличных от UNIX. Завершающий CR будет считаться частью пароля, как и другие завершающие пробелы. Точно так же чтение пароля может завершиться неудачно, если ваш пароль содержит какие-либо символы, отличные от ASCII, в которых важна кодировка файла.
TL, DR:
Я не знаю, слишком ли поздно отвечать на этот вопрос, но для кого-то еще, у кого есть эта проблема, я просто потратил пару часов, ударяясь головой о стену с виртуальной машиной CentOS6, пытаясь получить доступ к общим ресурсам cifs на хосте Windows 7 .
В конце концов, у меня сработало изменение строки пароля в файле учетных данных, чтобы использовать «pass» в качестве имени параметра. например
user=myUserName
domain=MYDOMAIN
pass=myStrongPasswordWithSpecialCharacters
Я не знаю, что-то в специальных символах в пароле что-то напортачило, когда файл был проанализирован, но я заметил, что имя пользователя и пароль анализируются для пользователя и передаются, поэтому решил сократить этот шаг, поместив эти значения напрямую в файле.
Надеюсь, это кому-то поможет.
Возможно, у вас есть пробелы в файле, возможно, между =
приметы? а -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
шоу? Возможно, раньше это не было проблемой, потому что использованная кодировка «взрывается» только на определенных символах, которых до сих пор не было в пароле. Самый простой способ устранить эту проблему - воссоздать файл и повторить попытку или сравнить старый рабочий пароль с новым и определить, какие новые специальные символы могли быть введены.
Вы должны иметь возможность использовать восьмеричные коды ASCII для специальных символов, например:
SPACE = \040
AMPERSAND = \046
Обратитесь к таблице ASCII здесь: http://www.asciitable.com/
Решение найдено: http://www.linuxforums.org/forum/ubuntu-linux/175662-solved-fstab-special-characters.html