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

Der*_*ler 6 freebsd ssh freenas

我正在为 FreeNAS 系统进行基于 rsync 的备份。

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

Could not create directory '/root/.ssh'.
Run Code Online (Sandbox Code Playgroud)

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

mkdir: /root/.ssh: Read-only file system
Run Code Online (Sandbox Code Playgroud)

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

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

小智 7

这里提到的解决方案很好,但我正在寻找一个不需要 ~/.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
    }
Run Code Online (Sandbox Code Playgroud)

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

export HOME=$HOME/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././.
Run Code Online (Sandbox Code Playgroud)


kur*_*rtm 5

临时重新挂载根文件系统读写,并为 .ssh 创建一个符号链接,指向 ssh可以写入的某个地方。通过这种方式,您还可以在将来执行诸如添加 ssh 密钥之类的操作,或者允许新的 known_hosts 使用,而无需进行额外的繁重步骤。 而且你可以摆脱你的-o UserKnownHostsFile在同一时间选择。