如何阻止 ssh 尝试创建 ~/.ssh?

如何阻止 ssh 尝试创建 ~/.ssh?

我正在为 FreeNAS 系统开发基于 rsync 的备份。

备份过程的一部分涉及登录充当备份存储的远程系统。每当我这样做时,我都会收到消息

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

我假设这是由于/root只读的事实,因为当我尝试~/.ssh手动创建时,我收到:

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

因此,我已经将该known_hosts文件移动到更适合我的备份过程,并用于-o UserKnownHostsFile解决与此相关的任何问题。

但是,当我调用它时ssh仍然尝试创建该文件夹。~/.ssh我怎样才能让它不尝试创建该文件夹?

答案1

这里提到的解决方案很好,但我正在寻找一个不需要 ~/.ssh 存在或需要尝试创建它的解决方案(在 Windows 上运行,分发 MSYS 构建的 ssh.exe,但在其他没有安装 MSYS/Cygwin 的机器)。

不幸的是,无论您赋予什么值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
    }

然而,有趣的是,它尝试扩展$HOME环境变量来确定主目录。由于缓冲区大约为 256 字节,我们实际上可以通过溢出缓冲区来绕过 if 条件(将 HOME 定义为长度超过 256 字节的字符串),例如:

export HOME=$HOME/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././.

答案2

临时重新挂载可读写的根文件系统,并为 .ssh 创建一个指向 ssh 所在位置的符号链接写。通过这种方式,您还可以在将来添加 ssh 密钥或允许新的known_hosts 等操作,而无需执行额外的繁琐步骤。 -o UserKnownHostsFile您可以同时放弃您的选择。

相关内容