Como posso parar o ssh de tentar criar ~ / .ssh?

4

Estou trabalhando em um backup baseado em rsync para um sistema FreeNAS.

Parte do processo de backup envolve o login no sistema remoto que serve como armazenamento de backup. Sempre que faço isso, recebo a mensagem

Could not create directory '/root/.ssh'.

Suponho que isso se deva ao fato de que /root é somente leitura, porque quando tento criar ~/.ssh manualmente, recebo:

mkdir: /root/.ssh: Read-only file system

Por causa disso, eu já movi o arquivo known_hosts mais apropriado para o meu processo de backup e estou usando -o UserKnownHostsFile para resolver qualquer problema relacionado a isso.

No entanto, ssh ainda tenta criar a pasta ~/.ssh quando eu a invoco. Como posso fazer para não tentar criar a pasta?

    
por Der Hochstapler 25.10.2013 / 20:42

2 respostas

5

Remonte o sistema de arquivos raiz de leitura / gravação temporariamente e faça um link simbólico para .ssh que aponte para algum lugar onde o ssh possa escrever. Dessa forma, você também pode fazer coisas como adicionar chaves ssh no futuro ou permitir novos known_hosts sem ter que ir a etapas extras extenuantes. E você pode se livrar de sua opção -o UserKnownHostsFile ao mesmo tempo.

    
por 25.10.2013 / 21:58
5

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/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././.
    
por 09.06.2017 / 03:03