我使用Paramiko与某个目标设备建立SSH连接,我想执行reboot
命令。
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(zip_hostname, username=username, password=password, timeout=1)
try:
stdin, stdout, stderr = ssh.exec_command("/sbin/reboot -f")
# .........
# some code
# .........
except AuthenticationException, e:
print ''
finally:
ssh.close()
但在执行ssh.exec_command("/sbin/reboot -f")
"某些代码"不执行,因为程序卡在exec_command
(由重新启动导致断开连接)。我该怎么做才能解决我的问题?
答案 0 :(得分:4)
试试这个:
ssh.exec_command("/sbin/reboot -f > /dev/null 2>&1 &")
重新启动的所有输出都被重定向到/ dev / null以使其不产生输出,并且由于'&'而在后台启动它。签到最后。希望程序不会以这种方式挂在该行上,因为远程shell会提示回来。
答案 1 :(得分:1)
从ssh获取传输并使用以下命令设置keepalive:
transport = ssh.get_transport()
transport.set_keepalive(5)
此sets the keepalive到5
秒;请注意,我希望timeout=1
能够实现同样的目标。
答案 2 :(得分:1)
您只需拨打channel.exec_command()
而不是高级界面client.exec_command()
# exec fire and forget
timeout=0.5
transport = ssh.get_transport()
chan = ssh.get_transport().open_session(timeout=timeout)
chan.settimeout(timeout)
try:
chan.exec_command(command)
except socket.timeout:
pass
答案 3 :(得分:0)
我遇到了这个问题,并设法切换到以下命令来避免它:
/sbin/shutdown -r now
注意:此命令不会产生任何
STDOUT
或STDERR
输出
答案 4 :(得分:0)
如果您或其他任何人在尝试使用转发代理(ssh密钥)或以我的情况(yubikey)使用sudo重启主机时遇到问题
如果将其视为bash,您将像这样以非root用户身份重新启动主机。
ssh -t -A user@hostname sudo /sbin/reboot
对于-A标志,来自ssh手册页
启用转发身份验证代理连接。也可以在每个主机的基础上指定 配置文件。 应谨慎启用代理转发。能够绕过对文件权限的用户 远程主机(用于代理的Unix域套接字)可以通过转发的连接访问本地代理。 攻击者无法从代理那里获取密钥材料,但是他们可以对密钥执行操作, 使他们能够使用加载到代理中的身份进行身份验证。*
对于-t标志,来自ssh手册页
强制伪tty分配。可用于在远程计算机上执行任意基于屏幕的程序, 这可能非常有用,例如实施菜单服务时。多个-t选项强制tty分配,甚至 如果ssh没有本地tty。*
因此,我们将其分解为您在paramiko中的操作方式
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=host, username=username)
s = ssh.get_transport().open_session()
paramiko.agent.AgentRequestHandler(s)
ssh.exec_command("sudo /sbin/reboot", get_pty=True)
用于身份验证转发(-bash ssh命令中的A标志)用于paramiko
ssh = paramiko.SSHClient() #'ssh' is client variable
s = ssh.get_transport().open_session() #get 'ssh' transport and open sessions assigned to 's' variable
paramiko.agent.AgentRequestHandler(s) #call in 's' to the forwarding agent for current ssh session
现在用于强制伪tty分配(bash ssh命令中的-t标志)用于paramiko
ssh.exec_command("sudo /sbin/reboot", get_pty=True)
将'get_pty = True'添加到exec_command将允许您执行 sudo / sbin / reboot
希望这会有所帮助,每个人的环境都不同,但这应该可以正常工作,就像您以bash身份运行一样。