当我想从bash shell重新启动我的D-Link DWL-3200-AP接入点时,我使用ssh连接到AP,并且只需在CLI界面中键入reboot 。 大约30秒后,AP重新启动:
# ssh [email protected] [email protected]'s password: ******** Welcome to Wireless SSH Console!! ['help' or '?' to see commands] Wireless Driver Rev 4.0.0.167 D-Link Access Point wlan1 -> reboot
声音很棒? 不幸的是,SSH客户端进程从不退出,出于某种原因(也许AP杀死SSH服务器有点太快,我不知道)。 我的SSH客户端进程被完全阻止(即使我等了几分钟,没有任何反应)。 我总是等待AP重启,然后打开另一个shell,findssh客户端进程ID(使用ps aux | grep ssh ),然后使用kill <pid>杀死ssh进程。 这很烦人。
所以我决定写一个python脚本来重启AP。 脚本使用python-pexpect通过ssh连接到AP的CLI接口,并尝试启动“reboot”命令。 这是脚本的样子:
#!/usr/bin/python # usage: python reboot_ap.py {host} {user} {password} import pexpect import sys import time command = "ssh %(user)s@%(host)s"%{"user":sys.argv[2], "host":sys.argv[1]} session = pexpect.spawn(command, timeout=30) # start ssh process response = session.expect(r"password:") # wait for password prompt session.sendline(sys.argv[3]) # send password session.expect(" -> ") # wait for D-Link CLI prompt session.sendline("reboot") # send the reboot command time.sleep(60) # make sure the reboot has time to actually take place session.close(force=True) # kill the ssh process
该脚本正确连接到AP(我试着运行一些其他命令,而不是reboot ,他们工作正常),它发送reboot命令,等待一分钟,然后杀死SSH进程。 问题是:这次,AP从不重新启动! 我不知道为什么。
任何解决scheme,任何人
在你的第一种情况下(从sshlogin重新启动):如果你的设备真的重启,那么所有进程都会被终止,包括连接到你的ssh客户端的进程。 你不应该在重新启动后login以杀死旧的进程,因为它们不能存在! 我怀疑你的SSH客户端没有优雅地处理强行closures远程端的连接,所以它挂起。 你应该能够closures/杀死你的本地系统。
对不起,我对expect不太了解,所以对于它的特殊问题我没有什么build议。 但是,如果你想脚本远程重启,可以通过密钥文件设置无密码的sshlogin,然后执行ssh root@mydevice reboot 。
如果您使用的是OpenSSH客户端,我build议您在手册页ssh(1)和ssh_config(5)中阅读“ESCAPE CHARACTERS”部分 – 您可以随时在客户端中强制终止会话,方法是input转义字符, 。
至于问题的核心,路由器中的ssh守护进程可能没有通知closures,所以它从不closures会话,并且让客户端等待TCP超时。 在这种情况下,设置ServerAliveInterval是相当合理的(你也应该能够在每个主机的基础上在sshconfiguration文件中设置它)。
您可能也对OpenWRT感兴趣。
我用ssh选项来欺骗,我想我只是find了解决办法。
只需将ServerAliveInterval ssh选项添加到ssh客户端命令,如下所示:
command = "ssh -o ServerAliveInterval=10 %(user)s@%(host)s"%{"user":sys.argv[2], "host":sys.argv[1]}
然后会发生什么情况是,进程完全阻塞(无需重新启动AP)约10秒,然后重新启动AP,并在60秒睡眠后脚本正常结束。
我仍然会欣赏一个更好的解决scheme或为什么解决这个问题的解释!
谢谢