如何调试服务器启动时未运行的 sshd

如何调试服务器启动时未运行的 sshd

我有一台运行 Ubuntu 10.04 最小系统的(虚拟)服务器。我似乎错误配置了 sshd,导致它在重启时无法启动。由于这是一台服务器,我现在不再具有对我的服务器的 shell 访问权限。任何 ssh 请求都会导致以下结果:

ssh: connect to host xxx.xxx.xxx.xxx port 22: Connection refused

并且/var/run/sshd.pid不存在。

我确实可以通过服务器提供商安装的 Virtuozzo Panel 访问文件系统。

我没有编辑/etc/init.d/ssh启动脚本,但我确实将其复制了,/etc/rc2.d/ssh希望它能在重启时启动 ssh。

我还尝试添加启动调用/etc/crontab

7 * * * * root /usr/bin/touch /root/cron_is_running

8 * * * * root /etc/init.d/ssh start

我既没有得到文件/root/cron_is_running,也没有sshd启动

我的日志文件没有提供太多有关 ssh 的错误消息,fe/var/log/syslog只在启动时显示很多named内容和一些mysql升级内容,这肯定不相关。

我非常感谢任何帮助,我已经在该服务器上配置了很多东西,通过安装新映像,我将丢失服务器上的所有数据。

更新:将脚本更改/etc/rc2.d/ssh/etc/rc2.d/S90ssh没有任何效果。/var/log/auth.log不包含任何暗示 ssh 尝试启动的行,但是它充满了这些行:

更新2:按照建议,我也尝试将其添加/usr/sbin/sshd/etc/rc.local。但测试似乎touch /tmp/test表明尽管设置了 +x 标志,但该文件仍未执行。我还尝试sleep 10在脚本开头添加rc.local,因为其他地方有人建议此脚本存在并发问题。

最后更新 再次感谢以下回答。它们在修复rcX.d/目录中缺少的 sshd 启动方面提供了巨大帮助。最后的修复是从 Virtuozzo 面板启动“修复”,这会将原始系统安装为具有原始网络设置的恢复系统文件系统的一部分。我可以使用 ssh 登录。我从恢复系统中复制了有效的 ssh 配置,覆盖了损坏的原始系统的 ssh 配置,完成了恢复,现在我可以再次登录了。

答案1

您尝试复制的尝试/etc/rc2.d/ssh几乎是正确的。

为了使脚本在/etc/rcX.d启动时运行,必须调用它,SxxZZZ其中S是文字 S(表示Start;您也可以使用它来K表示在关机时杀死),xx是一个数字,表示它在启动时运行的顺序(01 首先,99 最后),ZZZ是您的脚本名称。

因此,您需要类似 的内容S90ssh。数字并不十分重要,90 应该可以,到那时网络将正常运行,等等。

请注意,还必须将其设置为可执行文件 - 我不知道您使用的系统是否允许您这样做?希望复制现有ssh脚本并简单重命名将保留可执行位设置。

作为替代方案,/etc/rc.local可以将其用作通用的万能启动脚本。只需/usr/sbin/sshd在退出行之前放入其中即可开始sshd运行,这是最后的手段。

如果您仍然遇到问题,请尝试一下并更新您的问题:)

您可以检查/var/log/auth.log/var/log/syslog默认情况下不包含 sshd 消息)是否有如下行:

sshd[18838]: Server listening on 0.0.0.0 port 22.

看看它是否正在启动。

答案2

如果您输入/etc/init.d/并且sudo service ssh start没有任何问题(没有错误),那么您只需要运行sudo update-rc.d ssh defaults该服务就可以使服务达到正确的级别,并在您的系统关闭时将其终止。

您也可以手动复制脚本并重命名,以指示应在该级别停止或启动它。以下是使用该update-rc.d命令创建的文件:

   /etc/rc0.d/K20ssh -> ../init.d/ssh
   /etc/rc1.d/K20ssh -> ../init.d/ssh
   /etc/rc6.d/K20ssh -> ../init.d/ssh
   /etc/rc2.d/S20ssh -> ../init.d/ssh
   /etc/rc3.d/S20ssh -> ../init.d/ssh
   /etc/rc4.d/S20ssh -> ../init.d/ssh
   /etc/rc5.d/S20ssh -> ../init.d/ssh

因此,简单来说cp /etc/init.d/ssh /etc/rc0(1,6).d/K20sshcp /etc/init.d/ssh /etc/rc2(3,4,5).d/K20ssh可以了。(请注意,您必须cp针对每个rc.d文件夹运行该命令,该命令只是为所复制的文件指定的名称的一个示例)。

K20ssh在机器即将关闭时运行,S20ssh是应运行的级别的脚本的名称。

SK指出开始或者后面的数字表示文件夹内脚本的运行顺序,数字越小则越早运行,数字越大则越晚运行,如果ssh确实不需要,但 20 是 指定的默认值update-rc.d

相关内容