![如何在没有 /etc/passwd 的情况下连接到在嵌入式 Linux 上运行的 ssh 服务器?](https://linux22.com/image/40730/%E5%A6%82%E4%BD%95%E5%9C%A8%E6%B2%A1%E6%9C%89%20%2Fetc%2Fpasswd%20%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E8%BF%9E%E6%8E%A5%E5%88%B0%E5%9C%A8%E5%B5%8C%E5%85%A5%E5%BC%8F%20Linux%20%E4%B8%8A%E8%BF%90%E8%A1%8C%E7%9A%84%20ssh%20%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%9F.png)
在我的远程计算机(运行嵌入式 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` 后。
创建一个目录,其中将包含您的
/etc
.假设它是/custom/etc
.mkdir /custom/etc
创建一个安装点,您将在其中重新定位原始
/etc/
.mkdir /custom/original-etc
在替换
etc
原始文件中创建符号链接。cd /etc for x in *; do ln -s "../original-etc/$x" "/custom/etc/$x"; done
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