我已經在 CentOS 上使用 .config 設定了 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_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 字元(其中檔案的編碼很重要),則讀取密碼可能會失敗。
TL、博士:
- 密碼中不需要轉義任何內容
- 檢查是否可以從命令列掛載 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 虛擬機嘗試訪問Windows 7 主機上的cifs 共享,將頭撞在牆上。
最後,對我有用的是更改憑證檔案中的密碼行以使用“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