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
相关产品推荐
相关产品推荐

