Каково правильное экранирование файлов учетных данных монтирования autofs?

Каково правильное экранирование файлов учетных данных монтирования autofs?

Я настроил 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

Но это не сработало, так что я явно что-то упускаю. Может ли кто-нибудь объяснить, какие символы нужно экранировать в файле учетных данных и как правильно их экранировать?

решение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, где кодировка файла будет важна.

ТЛ,ДР:

  • В пароле не должно быть никаких экранированных символов.
  • Проверьте, работает ли монтирование тома 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? Возможно, есть случайный управляющий символ? Что :set listпоказывает открытие файла с помощью vim и запуск? Возможно, раньше это не было проблемой, потому что используемая кодировка «взрывается» только на определенных символах, которых не было в пароле до сих пор. Самый простой способ устранить эту неполадку — заново создать файл и повторить попытку или сравнить старый рабочий пароль с новым и определить, какие новые специальные символы могли быть введены.

решение3

Не знаю, может быть, уже слишком поздно отвечать на этот вопрос, но для тех, у кого возникла такая же проблема: я только что провел пару часов, бился головой об стену с виртуальной машиной CentOS6, пытаясь получить доступ к общим папкам cifs на хосте Windows 7.

В конце концов, мне помогло изменение строки пароля в файле учетных данных, чтобы использовать «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

Связанный контент