使用SAS GITFN_CLONE/GIT_CLONE通过GitHub部署密钥认证失败求助
解决方案
问题根源
SAS 9.4M7自带的Git版本(0.27)过于老旧,不支持Ed25519、ECDSA这类现代SSH密钥算法,且SAS内置Git函数的密钥处理逻辑和系统原生Git不一致,导致密钥认证失败。而系统原生Git能正常工作,是因为它调用的是系统自带的SSH客户端和较新的Git版本。
解决方法
方法1:让SAS调用系统原生SSH客户端
在SAS代码开头添加环境变量配置,强制SAS的Git函数使用系统的SSH(而非SAS自带的):
/* 指向CentOS7默认的系统SSH路径 */ %let SYSRC=%sysfunc(putenv(GIT_SSH=/usr/bin/ssh)); %let dirOut = %sysfunc(pathname(work))/package; data _null_; rc=GIT_CLONE( "git@github.com:allanbowe/sasjscore.git", "&dirOut" ); put rc=; run;
方法2:替换SAS内置的Git二进制
- 先备份SAS自带的Git文件:
cp /opt/sas94/SASFoundation/9.4/bin/sasexe/git /opt/sas94/SASFoundation/9.4/bin/sasexe/git.bak
- 将系统原生Git复制到SAS的Git路径(若CentOS7默认Git版本较低,先通过yum升级Git至2.20以上):
cp /usr/bin/git /opt/sas94/SASFoundation/9.4/bin/sasexe/git chmod 755 /opt/sas94/SASFoundation/9.4/bin/sasexe/git
方法3:直接调用系统Git命令(最稳妥)
绕开SAS内置的Git函数,直接用system命令调用系统原生Git:
%let dirOut = %sysfunc(pathname(work))/package; data _null_; cmd = catx(' ', 'git clone git@github.com:allanbowe/sasjscore.git', "&dirOut"); rc=system(cmd); put "返回码:" rc= "执行命令:" cmd=; run;
前置检查
确保SAS运行用户sasjssrv的.ssh目录和密钥权限正确:
chmod 700 /home/sasjssrv/.ssh chmod 600 /home/sasjssrv/.ssh/id_ed25519 # 替换为你的密钥文件名 chmod 644 /home/sasjssrv/.ssh/id_ed25519.pub
也可在SAS里测试SSH连通性,确认认证正常:
data _null_; rc=system('ssh -T git@github.com'); put "SSH测试返回码:" rc=; run;
返回码为0则表示认证成功。
内容的提问来源于stack exchange,提问作者Allan Bowe
相关产品推荐
相关产品推荐

