You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UNIX脚本执行SFTP时变量调用失败的问题求助

问题:SFTP拉取文件时命令被识别为系统命令报错

需求与流程

从AIX数据库服务器拉取带时间戳的唯一文件(如UA401.dat)至AIX应用服务器,流程如下:

  • COBOL程序生成文件名后,执行Shell脚本调用PL/SQL在数据库服务器生成文件;
  • COBOL程序执行第二个Shell脚本并传入含文件名在内的多参数,该脚本将文件名存入变量后通过SFTP拉取文件。

目前除SFTP使用变量时出现异常外,其余流程正常,错误表现为SFTP相关命令被识别为系统命令,提示未找到。

报错脚本片段

FILENM=$4

echo
echo "starting sh4 - friday am - area 2" 
echo $1 "  " $2 " " $3 " " $4 " " $5
echo "now lets try the new varialbles"
echo ${FILENM}
echo ${EMAILADDR}
echo
echo "new code"
echo

sftp  pclawson@lawdbtst1.hs.uab.edu
"lcd /LAWSON/lsfenv1/Interface_Dir/outbound"
cd "/ORACLE/bin/app/oracle/local/INFORT/Interface_Dir/outbound"
"get ${FILENM}"
quit

错误日志输出

starting sh4 - friday am - area 2  
         10    11-DEC-23   12-DEC-23   UAB401124711.dat   kkemp@uabmc.edu  
         now lets try the new varialbles  
         UAB401124711.dat  
         kkemp@uabmc.edu  
                 
         new code  
                 
Connected to lawdbtst1.hs.uab.edu.  
/LAWSON/lsfenv1/Interface_Dir/scripts/klktheory/./klktheory4.sh[44]: lcd /LAWSON/lsfenv1/Interface_Dir/outbound:  not found  

/LAWSON/lsfenv1/Interface_Dir/scripts/klktheory/./klktheory4.sh[45]: /ORACLE/bin/app/oracle/local/INFORT/Interface_Dir/outbound:  not found  

/LAWSON/lsfenv1/Interface_Dir/scripts/klktheory/./klktheory4.sh[46]: get UAB401124711.dat:  not found  

/LAWSON/lsfenv1/Interface_Dir/scripts/klktheory/./klktheory4.sh[47]: quit:  not found  

问题原因与修复方案

问题原因

当前写法是先启动SFTP交互会话,然后把lcd、cd、get、quit这些SFTP内部命令当成独立的系统命令执行,系统找不到这些仅在SFTP会话内有效的命令,因此报错。

修复方式

方式1:使用Here文档传递SFTP命令

将所有SFTP命令通过Here文档传递给sftp进程,确保命令在SFTP会话内执行,同时补上EMAILADDR的参数赋值:

FILENM=$4
EMAILADDR=$5  # 补上第五个参数的赋值

echo
echo "starting sh4 - friday am - area 2" 
echo $1 "  " $2 " " $3 " " $4 " " $5
echo "now lets try the new varialbles"
echo ${FILENM}
echo ${EMAILADDR}
echo
echo "new code"
echo

# 通过Here文档执行SFTP命令
sftp pclawson@lawdbtst1.hs.uab.edu << EOF
lcd /LAWSON/lsfenv1/Interface_Dir/outbound
cd /ORACLE/bin/app/oracle/local/INFORT/Interface_Dir/outbound
get ${FILENM}
quit
EOF

方式2:单行命令形式

用-b -参数让SFTP从标准输入读取命令,将所有命令用分号分隔成一行:

# 替换原SFTP相关代码为这一行
sftp pclawson@lawdbtst1.hs.uab.edu <<< "lcd /LAWSON/lsfenv1/Interface_Dir/outbound; cd /ORACLE/bin/app/oracle/local/INFORT/Interface_Dir/outbound; get ${FILENM}; quit"

内容的提问来源于stack exchange,提问作者klkemp100

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 23:29:49