我的SSH会话似乎正在中断,尽管这不是我的主要问题-主要问题是我以前的会话仍然有效,但更糟糕的是其中一个正在运行,visudo
阻止了我对其的访问!
who
显示了多个会话,除了我知道的当前会话已断开连接之外,所有会话都该如何连接?如何终止旧会话,从而释放它们的资源?
who
不再可用),谢谢!
我的SSH会话似乎正在中断,尽管这不是我的主要问题-主要问题是我以前的会话仍然有效,但更糟糕的是其中一个正在运行,visudo
阻止了我对其的访问!
who
显示了多个会话,除了我知道的当前会话已断开连接之外,所有会话都该如何连接?如何终止旧会话,从而释放它们的资源?
who
不再可用),谢谢!
Answers:
为了解决紧迫的问题,sudoers文件被锁定,您可以简单地删除该锁定文件。通常是“ /etc/sudoers.tmp”;检查手册页以查看visudo进行验证。如果删除了锁定文件,则可以再次运行visudo。
要删除所有仍挂起的会话,请首先找出您当前会话的pid。然后,如果您自己的pid是12345,请执行
ps -ef | grep sshd | grep -v root | grep -v 12345 | grep -v grep | awk '{print "sudo kill -9", $2}' |sh
您可能要在没有最终决定权的情况下这样做,| sh
只是检查您计划杀死的PID。
如果您使用的是Linux,则可以改用
pkill -o -u YOURUSERNAME sshd
杀死最老的SSH会话。继续执行此操作,直到当前会话剩下的只有一个。
您可能还希望设置为ServerAliveInterval 15
在.ssh/config
没有数据发送时每15秒发送一次保持活动消息。man ssh_config
欲获得更多信息。
grep -v 12345
部分语法的作用是什么?通过所有不包含的内容12345
?
grep -v 12345
表示“ 12345
从匹配中删除任何匹配的行”。因此,您应该首先确定自己会话的PID,然后使用该PID代替12345
。
who
或top
仍显示旧的已签名用户数,甚至应仅显示1。如何强制刷新?
如果您列出进程以便可以看到它们的命令和参数(例如ps -f
procps一样),则应该看到sshd进程,例如:
sshd: user@pts/7
终端(pts/7
)是此处的关键部分-如果将其与当前终端(tty
)进行比较,则可以看到哪个是您的活动会话。当然,还有其他方法可以做到这一点(例如查看当前正在运行的shell的PID并将其放在进程树中),但这可能是最简单的方法。然后,您可以按照以下方式使用:
# current tty name
TTY=$(tty | cut -f3- -d/)
# PIDs of other sshd processes
ps -o pid= -o command= -C sshd \
| grep sshd:.*@ \
| grep -v "@$TTY" \
| sed "s/ sshd.*//"
然后,您可以输入要杀死的PID,xargs
但始终确保不要杀死sshd
处理新连接的主进程。
值得一提的是,ps
由于其输出格式的可变性(在这里通过使用可以大大减轻),因此建议通常在解析输出时容易出错(尤其是在各种系统中-o pid= -o command=
)。
fuser -k /dev/pts/0
或者在who
输出中显示任何终端。但是,所有那些忽略了SIGHUP的人都有些奇怪。他们是在screen
会话中运行还是其他?