使用Paramiko通过SSH执行reboot命令

时间:2014-09-30 09:47:23

标签: python linux ssh paramiko

我使用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(由重新启动导致断开连接)。我该怎么做才能解决我的问题?

5 个答案:

答案 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 keepalive5秒;请注意,我希望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
  

注意:此命令不会产生任何STDOUTSTDERR输出

答案 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身份运行一样。