SSH could not create directory /home/USERNAME/.ssh
I found the answer to my solutions in this blog post.
"First locate the file called passwd
in your C:\path\to\cygwin\etc
directory and open it with wordpad. Second, replace the text /home/YOUR_NAME
with /cygdrive/c/Documents and Settings/YOUR_NAME
Finally, save the file."
Update
Some people have reported that adding %USERPROFILE% as a value to a system variable called "HOME" works.
For those 2019 tumbleweeds if you've tried everything here and nothing works if your nssswitch.conf
file has:
db_home: windows
In a Cygwin terminal running in admin mode try:
export CYGWIN=winsymlinks:native
mkdir -p /home/$USER
ln -s $HOME/.ssh /home/$USER
Additional Details
In 2015 Cygwin stopped creating a /etc/passwd
file by default:
Cygwin can now generate passwd/group entries directly from Windows user databases (local SAM or Active Directory), thus allowing to run Cygwin without having to create /etc/passwd and /etc/group files. Introduce /etc/nsswitch.conf file to configure passwd/group handling.
For bordercase which require to use /etc/passwd and /etc/group files, change mkpasswd/mkgroup to generate passwd/group entries compatible with the entries read from SAM/AD.
From https://github.com/Alexpux/Cygwin/blob/master/winsup/cygwin/release/1.7.34#L4-L11
As stated above mkpasswd
command and the etc/passwd
file was a way of 'connecting' with Windows Active Directory.
If you are using a company computer using Active Directory sometimes somewhere along the line Active Directory and/or Cygwin fail to communicate and you end up loosing the entry that controls where the HOME
directory is set. To test this run mkpasswd
and check if your username shows up in the list.
After running mkpasswd
and you don't see your username, by default, Cygwin's ssh
will search for the .ssh
folder in /home/$USER/.ssh
. That directory won't exists if you setup Cygwin with db_home: windows
which points the HOME
directory to C:\Users\$USER
. So the above commands fix this by:
# Use windows native symlinks (only works in while running as admin)
export CYGWIN=winsymlinks:native
# Create missing directory structure (C:\[Cygwin install directory]\home\$USER)
mkdir -p /home/$USER
# Link C:\User\$USER\.ssh -> C:\[Cygwin install directory]\home\$USER\.ssh
ln -s $HOME/.ssh /home/$USER
These commands are a hack and the real solution would involve figuring out why mkpasswd
is failing to create a entry for the user. However, that would probably involve digging into both Active Directory and Cygwin :(.