Python 如何指定身份验证类型

Python 如何指定身份验证类型,python,ssh,kerberos,airflow,paramiko,Python,Ssh,Kerberos,Airflow,Paramiko,我正在尝试使用SSHOperator从Airflow worker通过ssh连接到我的一台服务器。我的SSH被配置为使用Kerberos身份验证类型。使用下面的额外参数配置默认SSH连接时出现以下错误 SSH运算符错误:身份验证类型错误;允许的类型:['publickey、'gssapi-keyex',带麦克风的gssapi,'keyboard-interactive'] 如何解决此错误。我尝试了以下设置在我的气流用户界面连接的附加字段中 { "gss-auth":"true","gssapi-

我正在尝试使用
SSHOperator
从Airflow worker通过ssh连接到我的一台服务器。我的SSH被配置为使用Kerberos身份验证类型。使用下面的额外参数配置默认SSH连接时出现以下错误

SSH运算符错误:身份验证类型错误;允许的类型:['publickey、'gssapi-keyex',带麦克风的gssapi,'keyboard-interactive']

如何解决此错误。我尝试了以下设置在我的气流用户界面连接的附加字段中

{ "gss-auth":"true","gssapi-keyex":"true","gss-kex":"true"}

在http://code>SSHoperator中是否有选项指定要使用的身份验证类型为Kerberos

现有的Airflow的
SSHOperator
中没有Kerberos身份验证支持,即使底层Paramiko库具有该支持

我可以通过编写一个扩展
SSHHook
的自定义钩子来解决这个问题,它将一个参数传递给底层的Paramiko库,以指定Kerberos作为身份验证类型。成功了!由于气流易于扩展

自定义挂钩:

class CustomSSHHook(SSHHook):
"""
支持kerberose身份验证的自定义SSH钩子
"""
定义初始化(自我,
ssh\u conn\u id=None,
远程主机=无,
用户名=无,
密码=无,
key_file=None,
端口=无,
超时=10,
保持活动时间间隔=30):
超级(自定义、自选)__(
ssh_连接id,
远程主机,
用户名,
密码,
密钥文件,
港口,
超时,
保持周期(间隔)
#使用连接覆盖默认值
self.gss_auth=False
如果self.ssh\u conn\u id不是None:
conn=self.get\u连接(self.ssh\u conn\u id)
如果conn.extra不是None:
额外选项=conn.extra\u dejson
如果额外选项中有“gss\U auth”\
和str(额外选项[“gss\u auth”])。lower()=“true”:
self.gss_auth=True
def get_conn(自身):
"""
打开到远程主机的ssh连接。
:返回paramiko.SSHClient对象
"""
self.log.debug('为连接id:%s,self.SSH\u连接id创建SSH客户端)
client=paramiko.SSHClient()
client.load\u system\u host\u key()
如果self.no\u host\u key\u检查:
#默认为拒绝策略
client.set\缺少\主机\密钥\策略(paramiko.AutoAddPolicy())
如果self.password和self.password.strip():
client.connect(主机名=self.remote\u主机,
username=self.username,
password=self.password,
key\u filename=self.key\u文件,
timeout=self.timeout,
compress=self.compress,
端口=self.port,
sock=self.host\u代理)
其他:
client.connect(主机名=self.remote\u主机,
username=self.username,
key\u filename=self.key\u文件,
timeout=self.timeout,
compress=self.compress,
端口=self.port,
sock=self.host\u代理,
gss_auth=self.gss_auth)
如果self.keepalive\u间隔:
client.get_transport().set_keepalive(self.keepalive_interval)
self.client=client
返回客户端
类CustomSshPlugin(AirflowPlugin):
name=“ssh\u插件”
默认插件=“1.0”
hooks=[CustomSSHHook]
和以上可在DAG中使用,如下所示:

来自afflow.hooks.ssh\u插件导入自定义shhook
edge\u node\u hook=CustomSSHHook(ssh\u conn\u id=“ssh\u con\u id”,
远程主机=主机ip,
端口=22,
超时=100)
ssh\u execution=SSHOperator(dag=dag,task\u id='sample\u task',
ssh\u hook=edge\u node\u hook,
command='whoami',
do_xcom_push=False)
您必须在id为“ssh\u conn\u id”的连接的extras字段中添加以下参数

{"gss_auth":"true"}

这是一个关于软件工具的特定编程问题。我在这个问题上加了同样的标签。