使用Airflow SFTPToGCSOperator时遇host_proxy_cmd参数TypeError错误求助
解决Airflow SFTPToGCSOperator报错:TypeError: SSHHook.init() got an unexpected keyword argument 'host_proxy_cmd'
问题原因
这个报错源于你使用的Airflow版本中,SSHHook不支持host_proxy_cmd参数。host_proxy_cmd是Airflow 2.4.0版本才新增的参数,若当前使用的是2.3.x及更早版本,即便你在Airflow UI的SFTP连接里配置了该字段,Operator初始化时会把所有连接参数传递给SSHHook,旧版本无法识别这个参数就会触发报错。
解决方案
方案1:升级Airflow到2.4.0及以上版本
如果环境允许升级,直接将Airflow版本更新到2.4.0或更高版本,就能原生支持host_proxy_cmd参数。对于Docker环境,修改docker-compose.yaml中的Airflow镜像标签(比如apache/airflow:2.6.3),重新部署容器即可。
方案2:修改SFTP连接配置(不升级版本)
若无法升级Airflow,打开Airflow UI的SFTP连接配置页面,删除host_proxy_cmd相关配置项。如果需要通过代理连接SFTP,可改用以下方式:
- 在Docker容器中配置系统级代理,设置
HTTP_PROXY、HTTPS_PROXY环境变量,让SFTP客户端自动使用代理。 - 使用
proxy_jump参数(Airflow 2.2+支持),在连接配置中填写proxy_jump字段,格式为user@proxy_host:port,通过跳板机连接SFTP服务器。
方案3:自定义处理连接参数(进阶)
如果必须保留host_proxy_cmd配置且不能升级,可以自定义Operator或修改SSHHook的初始化逻辑,过滤掉不支持的参数。示例代码如下:
from airflow.providers.google.cloud.transfers.sftp_to_gcs import SFTPToGCSOperator from airflow.providers.ssh.hooks.ssh import SSHHook class CustomSFTPToGCSOperator(SFTPToGCSOperator): def _get_ssh_hook(self) -> SSHHook: hook = SSHHook(ssh_conn_id=self.sftp_conn_id) # 手动处理连接参数,过滤掉host_proxy_cmd conn = hook.get_connection(self.sftp_conn_id) extra = conn.extra_dejson if 'host_proxy_cmd' in extra: # 若需使用代理命令,可在此手动设置到hook的ssh_client # 示例:hook.ssh_client.set_proxy_command(extra['host_proxy_cmd']) pass return hook # 使用自定义Operator替代原Operator transfer_to_gcs = CustomSFTPToGCSOperator( task_id=f'transfer_{table}', sftp_conn_id="sftp_connection", source_path=sftp_path, destination_bucket=gcs_bucket, destination_path=file_name, dag=dag )
内容的提问来源于stack exchange,提问作者BacktoCoding9
相关产品推荐
相关产品推荐

