如果您或其他人在尝试使用转发代理(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 标志) for 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 运行时完全相同。