A solução mencionada aqui é boa, mas eu estava procurando por uma que não exigisse que o ~ / .ssh estivesse presente ou exigisse uma tentativa para que ela fosse criada (rodando no Windows, distribuindo um ssh.exe compilado pelo MSYS, mas rodando em outras máquinas sem o MSYS / Cygwin instalado).
Infelizmente, parece que a rotina é codificada permanentemente no código-fonte, independentemente do valor atribuído a UserKnownHostsFile
:
r = snprintf(buf, sizeof buf, "%s%s%s", pw->pw_dir,
strcmp(pw->pw_dir, "/") ? "/" : "", _PATH_SSH_USER_DIR);
if (r > 0 && (size_t)r < sizeof(buf) && stat(buf, &st) < 0) {
#ifdef WITH_SELINUX
ssh_selinux_setfscreatecon(buf);
#endif
if (mkdir(buf, 0700) < 0)
error("Could not create directory '%.200s'.",
buf);
#ifdef WITH_SELINUX
ssh_selinux_setfscreatecon(NULL);
#endif
}
No entanto, é interessante observar que ele tenta expandir a variável de ambiente $HOME
para determinar o diretório inicial. Como o buffer tem cerca de 256 bytes, podemos ignorar a condição if ao transbordar o buffer (definindo HOME para uma string com mais de 256 bytes), por exemplo:
export HOME=$HOME/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././.