Qual é o escape correto para arquivos de credenciais de montagem autofs?

Qual é o escape correto para arquivos de credenciais de montagem autofs?

Eu configurei o autofs no CentOS usando /etc/auto.mymount. Algo assim:

mymount -fstype=cifs,rw,noperm,credentials=/etc/auto.creds.svc_account ://winserver.domain.local/SharedFolder

Isso tem funcionado e ainda funciona para algumas montagens. No entanto, uma senha foi alterada para uma conta usada para conexão com um servidor Windows e agora contém todos os tipos de caracteres especiais. Meu arquivo de credenciais /etc/auto.creds.svc_accounté mais ou menos assim:

username=svc_account
password=AbCd@a;abc{`B"[C\\~/fg9w(G':4##abC}d3.H}v,2]f+c

Obviamente alterei a senha acima, mas ela contém vários caracteres não alfanuméricos que estão na senha real.

Olhando em/var/log/messages, vejo o seguinte:

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 a única coisa que mudou foi a senha, suponho que existam caracteres especiais que precisam ser escapados de alguma forma.

Agora eu sei que se eu colocar essa senha na linha de comando, os comandos cairão devido aos vários caracteres especiais, que podem ser resolvidos precedendo cada um deles com uma barra invertida. Por exemplo:

password=AbCd@a\;abc{\`B\"[C\\\\~/fg9w\(G\':4##abC}d3.H}v,2]f+c

Mas isso não funcionou, então claramente estou perdendo alguma coisa. Alguém é capaz de explicar quais caracteres precisam ser escapados em um arquivo de credenciais e a maneira correta de escapar deles?

Responder1

Suponho que o arquivo de credenciais será lido por mount.cifs, como acontece com outras montagens CIFS. Então eu dei uma olhadao mount.cifs.carquivo fonte no código cifs-utils atual, que deve ser para a versão 6.3. Ocódigo para ler a senhanão faz nenhum escape, exceto que cada vírgula é duplicada no passwordcampo da parsed_mount_infostruct, como é aparentemente necessário ao montar os parâmetros para a mount(2)chamada:

/*
 * 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;
}

No caso de um arquivo de credenciais, srcaponta para a posição na linha da senha logo atrás do =sinal. Tudo entre o =sinal e o final da linha lida fgets()é copiado no campo de senha. (A nova linha é substituída por um byte nulo antes da cópia.) Mas para qualquer outra forma de definir uma senha, como variáveis ​​de ambiente, opções ou de stdin, a mesma rotina é chamada, portanto, se a montagem do volume funcionar a partir da linha de comando, essa duplicação de vírgula não é a culpada.

No entanto, você poderá ter problemas se alguma linha contiver espaços em branco à direita ou se seu arquivo de credenciais tiver finais de linha não UNIX. Um CR final seria lido como parte da senha, assim como outros espaços em branco finais. Da mesma forma, a leitura da senha poderá falhar se sua senha contiver caracteres não ASCII, onde a codificação do arquivo seria importante.

TL, DR:

  • Nada precisa ser escapado na senha
  • Verifique se a montagem do volume CIFS funciona na linha de comando
  • Verifique se há espaços em branco à direita na linha da senha
  • Verifique se o seu arquivo de credenciais tem formato UNIX e nenhum final de linha DOS
  • Verifique se há caracteres não ASCII (como tremas) na senha
  • Verifique se funciona com senha sem vírgulas (realmente não deveria fazer diferença, mas quem sabe)

Responder2

Você possivelmente tem algum espaço no arquivo, talvez entre os =sinais? um -13erro pode ser causado por espaços no arquivo creds, conforme link a seguir. http://thinkinginsoftware.blogspot.com/2011/09/cifs-vfs-cifsmount-failed-return-code.html

Meu próprio pensamento também me pergunta se isso pode ser devido a um problema de codificação no próprio arquivo. O que file -bi /etc/auto.creds.svc_accountretorna? Talvez haja um personagem de controle perdido? O que mostra abrir o arquivo com o vim e executar :set list? Talvez não fosse um problema antes porque a codificação usava apenas "explode" certos caracteres que não estavam presentes na senha até agora. A maneira mais fácil de solucionar isso seria recriar o arquivo e tentar novamente ou comparar a senha de trabalho antiga com a nova e determinar quais novos caracteres especiais podem ter sido introduzidos.

Responder3

Não sei se é tarde demais para responder a isso, mas para qualquer outra pessoa que esteja tendo esse problema, passei algumas horas batendo minha cabeça contra a parede com uma VM CentOS6 tentando acessar compartilhamentos cifs no host do Windows 7 .

No final, o que funcionou para mim foi alterar a linha de senha no arquivo de credenciais para usar “pass” como nome do parâmetro. por exemplo

user=myUserName
domain=MYDOMAIN
pass=myStrongPasswordWithSpecialCharacters

Não sei se algo sobre os caracteres especiais na senha estragou alguma coisa quando o arquivo foi analisado, mas notei que o nome de usuário e a senha estavam sendo analisados ​​para usuário e passagem, então decidi cortar essa etapa colocando esses valores diretamente no arquivo.

Espero que isso ajude alguém.

Responder4

Você deve ser capaz de usar códigos ASCII octais para caracteres especiais, por exemplo:

SPACE = \040
AMPERSAND = \046

Consulte a tabela ASCII aqui:http://www.asciitable.com/

Solução encontrada em:http://www.linuxforums.org/forum/ubuntu-linux/175662-solved-fstab-special-characters.html

informação relacionada