我正在为 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
您可以同时放弃您的选择。