autofs 마운트 자격 증명 파일의 올바른 이스케이프는 무엇입니까?

autofs 마운트 자격 증명 파일의 올바른 이스케이프는 무엇입니까?

.NET을 사용하여 CentOS에서 autofs를 구성했습니다 /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_infomount(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가 아닌 문자가 포함되어 있으면 비밀번호 읽기가 실패할 수 있습니다.

TL,DR:

  • 비밀번호에서 이스케이프된 항목이 없어야 합니다.
  • 명령줄에서 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? 아마도 길 잃은 제어 문자가 있습니까? vim으로 파일을 열고 실행하면 무엇을 :set list볼 수 있나요? 아마도 지금까지 비밀번호에 존재하지 않았던 특정 문자에 대해서만 사용된 인코딩이 "폭발"했기 때문에 이전에는 문제가 되지 않았을 것입니다. 이 문제를 해결하는 가장 쉬운 방법은 파일을 다시 만들고 다시 시도하거나 이전 작업 비밀번호를 새 비밀번호와 비교하여 어떤 새로운 특수 문자가 도입되었는지 확인하는 것입니다.

답변3

답변하기에는 너무 늦었는지는 모르겠지만, 이 문제가 있는 다른 사람을 위해 저는 Windows 7 호스트의 cifs 공유에 액세스하려고 CentOS6 VM을 사용하여 벽에 머리를 두드리는 데 몇 시간을 보냈습니다. .

결국 나에게 도움이 된 것은 "pass"를 매개변수 이름으로 사용하도록 자격 증명 파일의 비밀번호 줄을 변경하는 것이었습니다. 예를 들어

user=myUserName
domain=MYDOMAIN
pass=myStrongPasswordWithSpecialCharacters

파일을 구문 분석할 때 암호의 특수 문자에 대한 문제가 발생했는지는 모르겠지만 사용자 이름과 암호가 사용자에게 구문 분석되어 전달되는 것을 확인하고 해당 값을 직접 입력하여 해당 단계를 생략하기로 결정했습니다. 파일에서.

이것이 누군가에게 도움이 되기를 바랍니다.

답변4

특수 문자에는 8진수 ASCII 코드를 사용할 수 있어야 합니다. 예:

SPACE = \040
AMPERSAND = \046

여기에서 ASCII 테이블을 참조하세요.http://www.asciitable.com/

해결 방법:http://www.linuxforums.org/forum/ubuntu-linux/175662-solved-fstab-special-characters.html

관련 정보