如何使用Kerberos票据通过SSH执行命令及Jupyterhub场景Python实现
使用python-gssapi + Paramiko实现Kerberos认证的SSH远程执行
以下是满足需求的Python代码实现,涵盖通过用户名/密码获取Kerberos票据,并将其传递给Paramiko进行SSH认证、执行远程命令的完整流程:
import gssapi import paramiko from paramiko.gss_auth import GSS_AUTH def get_kerberos_ticket(username, password, realm): # 构造Kerberos用户主体 user_principal = f"{username}@{realm}" name = gssapi.Name(user_principal, gssapi.NameType.user) # 使用用户名密码获取凭证 creds = gssapi.Credentials( name=name, usage='initiate', store={'password': password} ) return creds def ssh_with_kerberos(remote_host, kerberos_creds, command): ssh_client = paramiko.SSHClient() ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: # 配置SSH连接使用GSSAPI认证,并传入已获取的Kerberos凭证 ssh_client.connect( hostname=remote_host, gss_auth=True, gss_k5identity=None, # 禁用默认的票据文件读取 gss_deleg_creds=False, gss_creds=kerberos_creds # 显式传递获取到的凭证 ) # 执行远程命令 stdin, stdout, stderr = ssh_client.exec_command(command) output = stdout.read().decode() error = stderr.read().decode() return output, error finally: ssh_client.close() # 示例调用 if __name__ == "__main__": # 配置参数 USERNAME = "your_username" PASSWORD = "your_password" REALM = "YOUR.KERBEROS.REALM" REMOTE_HOST = "remote.server.com" COMMAND = "your_batch_command.sh" # 获取Kerberos票据 kerberos_creds = get_kerberos_ticket(USERNAME, PASSWORD, REALM) # 执行远程SSH命令 output, error = ssh_with_kerberos(REMOTE_HOST, kerberos_creds, COMMAND) print("命令输出:\n", output) if error: print("错误信息:\n", error)
关键步骤说明
- 获取Kerberos票据:通过
gssapi.Credentials直接使用用户名和密码生成凭证,无需依赖本地票据缓存文件,适合JupyterHub这类Web服务场景。 - Paramiko GSSAPI认证:在
connect方法中启用gss_auth=True,并通过gss_creds显式传入已获取的凭证,同时禁用默认的票据文件读取(gss_k5identity=None),确保使用指定的凭证进行认证。 - 资源清理:通过
finally块确保SSH连接被正确关闭,避免资源泄漏。
JupyterHub部署注意事项
- 票据生命周期:Kerberos凭证有有效期限制,建议在每次执行远程任务前重新获取,或在凭证过期时自动刷新。
- 安全控制:在JupyterHub中需严格隔离用户凭证,避免不同用户的Kerberos信息泄露,不要将密码硬编码到代码中,建议通过JupyterHub的用户认证系统获取安全的凭证输入。
- 权限配置:确保远程服务器的SSH服务已启用GSSAPI认证,且用户主体拥有执行目标批处理任务的权限。
内容的提问来源于stack exchange,提问作者Hoeze
相关产品推荐
相关产品推荐

