ssh服务重启 (如何卸载ssh服务端)

ssh客户端更改端口,SSH客户端

当我尝试在运行远程后台作业后注销时,我的ssh客户端卡住了!以下操作不会按预期进行:

   ssh me@remotehost 'sleep 120 &'
   # 客户端将被挂起120秒

这是OpenSSH的一个“特性”。只要远程终端仍在使用中,客户端就不会关闭连接。对于"sleep 120 &"这样的命令,标准输出(stdout)和标准错误(stderr)仍然连接到终端。

最简单的解决方法是告诉OpenSSH在认证完成后立即断开连接:

ssh -f me@remotehost 'sleep 120'

对于你的问题的直接答案是:“如何让客户端断开连接以便恢复shell?”——是杀死ssh客户端进程。你可以使用kill或pkill命令来做到这一点;或者对于非交互式(上述示例)的ssh会话,发送INT信号(通常是Ctrl-C);或者对于交互式的远程shell,在客户端的终端窗口中按下<Enter><~><.>(回车,波浪线,句点)。

问题在于stdout和stderr文件描述符仍然连接到终端,阻止ssh退出。因此,长期的解决方法是确保所有这些文件描述符要么关闭,要么重定向到远程端的日志文件(或/dev/null)。

ssh me@remotehost 'sleep 120 >/dev/null 2>&1 &'
# 客户端应立即返回

在某些传统Unix系统上重新启动守护进程也适用于这种情况。

ssh root@hp-ux-box   # 交互式shell
   ...                  # 发现问题是过期的NFS句柄
/sbin/init.d/nfs.client stop   # autofs由此脚本管理和
/sbin/init.d/nfs.client start  # 在HP-UX上终止它是可以接受的(与Linux不同)
exit
# # 客户端被挂起,使用Enter ~ .来杀死它。

请注意,允许root通过SSH登录是一种非常不良的安全实践。如果你必须这样做,那么创建一个单独的脚本,在其中执行所有需要的命令,不包含命令行选项,并配置sudoers文件,以授予一个用户无需密码运行该脚本的权限。这将确保您知道哪些命令需要定期运行,并且如果常规账户受到攻击,所造成的损害可以量化。

传统的Unix /sbin/init.d/nfs.client脚本在后台运行守护进程,但是将其stdout和stderr连接到了终端(并且它们没有完全自身守护化)。解决方法要么修复Unix供应商错误的init脚本,要么在出现此情况后杀死ssh客户端进程。本文作者使用了后者的方法。

了解更多shell实用技巧,快速掌握大厂一线经验

如果您觉得文章内容对你有一点帮助可以关注我,我在头条平台会持续分享更多实用的shell技巧和最佳实践,如果想系统的快速学习shell的各种高阶用法和生产环境避坑指南可以看看 《shell脚本编程最佳实践》专栏 ,专栏里有更多的实用小技巧和脚本代码分享。