When mounting CIFS shares, using a credentials file is generally considered more secure than passing credentials directly in the command line. However, a common pitfall occurs when passwords contain special characters that might be interpreted differently by the shell and the credentials parser.
The original attempt fails with an "Access Denied" error:
mount.cifs //server/share /mnt/share -o credentials=credfile
Credentials file content:
username=Administrator
password=What@zR\!p3s
Interestingly, the direct command-line approach succeeds:
mount.cifs //server/share /mnt/share -o username=Administrator,password=What@zR\!p3s
The discrepancy stems from how special characters are processed:
- In the credentials file, backslashes might be treated as escape characters during file reading
- When passed directly, the shell handles the escaping differently
- The bang (!) character can cause additional interpretation issues
Here are several approaches to resolve this:
1. Double Escaping in Credentials File
username=Administrator
password=What@zR\\!p3s
2. Using Single Quotes in Command Line
mount.cifs //server/share /mnt/share -o credentials='credfile'
3. URL Encoding Special Characters
username=Administrator
password=What%40zR%5C!p3s
4. Creating a Helper Script
#!/bin/bash
MOUNT_POINT="/mnt/share"
SHARE="//server/share"
CRED_FILE="/path/to/credfile"
mount.cifs "$SHARE" "$MOUNT_POINT" -o "credentials=$CRED_FILE"
- Always set strict permissions (chmod 600)
- Consider using a dedicated credentials directory
- Test with simple passwords first when troubleshooting
- Check system logs for additional error details
For persistent mounts, consider adding to /etc/fstab with proper escaping:
//server/share /mnt/share cifs credentials=/path/to/credfile,uid=1000,gid=1000,file_mode=0644,dir_mode=0755 0 0
Or use environment variables in a wrapper script:
export CIFS_USER="Administrator"
export CIFS_PASS="What@zR\\!p3s"
mount.cifs //server/share /mnt/share -o user=$CIFS_USER,pass=$CIFS_PASS
When working with CIFS mounts on XenServer 5.6 FP1, many administrators encounter authentication failures when special characters appear in the password field of credentials files. The specific error manifests as:
mount.cifs //server/share /mnt/share -o credentials=credfile
# Returns: "Access Denied"
Yet the direct credential passing works:
mount.cifs //server/share /mnt/share -o username=Administrator,password=What@zR\\!p3s
# Succeeds
The credentials file parsing in older CIFS implementations has known issues with:
- Special characters (@, !, \, etc.)
- Backslash escaping sequences
- Newline handling
A typical credentials file structure:
username=value
password=value
domain=value
Method 1: Character Escaping in Credentials File
For passwords containing special characters, try these variants in your credentials file:
# Option 1: Double escaping
password=What@@zR\\!p3s
# Option 2: Hex encoding
password=What\x40zR\x5C\x21p3s
# Option 3: Single quotes
password='What@zR\!p3s'
Method 2: Environment Variables
Create a wrapper script:
#!/bin/bash
export CIFS_PASS="What@zR\\!p3s"
mount.cifs //server/share /mnt/share -o username=Administrator,pass="${CIFS_PASS}"
Method 3: Direct Mount Options
When possible, pass credentials directly:
mount -t cifs //server/share /mnt/share \
-o username=Administrator,password=What@zR\\!p3s,sec=ntlmssp
- The bundled CIFS version (5.6 FP1) uses legacy parsing
- Consider upgrading to newer XenServer versions
- Test with different security options: sec=ntlm,sec=ntlmssp,sec=ntlmv2
Enable verbose logging:
mount.cifs -v //server/share /mnt/share -o credentials=credfile,debug=1
Check system logs:
dmesg | tail -20
journalctl -xe