autofs マウント資格情報ファイルの正しいエスケープ方法は何ですか?

autofs マウント資格情報ファイルの正しいエスケープ方法は何ですか?

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

資格情報ファイルは、他のCIFSマウントと同様に、によって読み込まれると思いますmount.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()パスワード フィールドにコピーされます。 (改行はコピー前に null バイトに置き換えられます。) ただし、環境変数、オプション、または 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返されるのでしょうか? おそらく、制御文字が紛れ込んでいるのでしょうか? vim でファイルを開いて実行すると何が:set list表示されますか? おそらく、これまでパスワードに存在しなかった特定の文字でのみエンコードが「失敗する」ため、以前は問題にならなかったのでしょう。この問題をトラブルシューティングする最も簡単な方法は、ファイルを再作成して再試行するか、古い有効なパスワードと新しいパスワードを比較して、どのような新しい特殊文字が導入されたかを判断することです。

答え3

これに答えるには遅すぎるかどうかはわかりませんが、この問題を抱えている他の人のために言っておきますが、私は CentOS6 VM で Windows 7 ホスト上の cifs 共有にアクセスしようとして、数時間頭を悩ませていました。

最終的に、私にとってうまくいったのは、資格情報ファイルのパスワード行を変更して、パラメータ名として「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

関連情報