如何在没有 /etc/passwd 的情况下连接到在嵌入式 Linux 上运行的 ssh 服务器?

如何在没有 /etc/passwd 的情况下连接到在嵌入式 Linux 上运行的 ssh 服务器?

在我的远程计算机(运行嵌入式 Linux)上安装 ssh 服务器后,我尝试从主机连接到 ssh 服务器,但失败了。

这是因为我在连接 ssh 服务器时无法指定用户帐户(ssh 连接需要输入帐户密码),因为我的目标嵌入式 Linux 没有/etc/passwd并且/etc不可写。因此该系统上没有用户帐户。

我们是否有其他方法可以从主机连接到远程计算机上的 ssh 服务器?我想以 root 用户身份登录。

这个问题是我上一个问题的后续问题如何在没有“/etc/passwd”的嵌入式Linux上检查我的帐户?

答案1

Dropbear 调用getpwnam用于获取有关用户帐户信息的标准库函数。在带有GNU libc(非嵌入式Linux系统的标准库)的系统上,该函数可以通过国家安全服务机制, 包括/etc/passwd。嵌入式系统可能运行各种 libc(uClibc、dietlibc 等),并且它们往往会/etc/passwd内置路径。

如果没有修补和重新编译 dropbear (或你的 libc),你将不得不以/etc/passwd某种方式提供该文件。有多种方法可以使额外的文件出现在只读文件系统之上,不是通过修改文件系统,而是通过指示内核在这些位置提供来自不同文件系统的文件。通用机制是联合安装,但嵌入式Linux系统往往缺乏良好的联合挂载功能。

用不同内容覆盖文件系统位置的一种相对简单的方法是mount --bind。运行命令mount --bind /else/where/some/where , any access to a file/some/where/somefile actually accesses the file/else/where/somefile ; any file in the “true”/else/where is hidden. However, you cannot directly make a file appear this way: both/else/where and/some/where have to exist (although they don't have to be directories). So you can't make/etc/passwd come into existence, but you can override/etc` 后。

  1. 创建一个目录,其中将包含您的/etc.假设它是/custom/etc.

    mkdir /custom/etc
    
  2. 创建一个安装点,您将在其中重新定位原始/etc/.

    mkdir /custom/original-etc
    
  3. 在替换etc原始文件中创建符号链接。

    cd /etc
    for x in *; do ln -s "../original-etc/$x" "/custom/etc/$x"; done
    
  4. passwd在替换层次结构中创建一个文件etc

    echo "root:x:0:0:root:/:/bin/sh" >/custom/etc/passwd
    

/etc在引导时,首先执行绑定安装以在 处创建原始层次结构的视图,然后执行绑定安装以在 处/custom/original-etc创建替换视图。将这些命令放入启动期间执行的脚本中(与启动 dropbear 服务器的脚本相同,显然是在启动 dropbear 之前)。/etc/etc

mount --bind /etc /custom/original-etc
mount --bind /custom/etc /etc

相关内容