IT WORK/SAP FI and ABAP

[ABAP] SFTP 접속해서 파일 전송하기

Bathildis 2024. 11. 19. 15:11
반응형

SAP에서는 직접적으로 SFTP 연결이 안된다고 알고 있습니다. (아니면 댓글 달아주세요.)

그래서 SAP 서버에 shell파일을 만들어놓고 실행하는 방법으로 우회할 수 있습니다.

 

1. Shell 파일 생성 후 SAP서버에 업로드

#!/bin/bash
USER="id"
PASS="password"
TARGET="ip"
PORT="port"
DIR_SOURCE="/local/directory"
DIR_TARGET="/remote"

## If filename is exist, then execute sftp. 
if [ -n "$1" ];
	then
	FILE="$1"
	expect << EOF 
	spawn sftp -oPort=${PORT} ${USER}@${TARGET}
	expect "password:" { send "${PASS}\r"}
	expect "sftp>" { send "lcd ${DIR_SOURCE}\r"}
	expect "sftp>" { send "cd ${DIR_TARGET}\r"}
	expect "sftp>" { send "put ${FILE}\r"}
	expect "sftp>" { send "bye\r"}
	expect eof
	EOF
else
  echo "Please give me the filenames."
fi

 

2. 위 파일을 업로드한 경로를 SM69에서 설정

 

3. ABAP 소스 작성

REPORT YEDIT.

DATA: LV_FILE(255),          " 보낼 FILE
      LV_FILEN(255),         " 보낼 FILE 이름 (확장자포함)
      LV_LODIR(255) TYPE C,  " 보낼 FILE 저장 DIRECTORY
      LV_FPATH(255).         " PATH + FILE 이름

" 파일명
CONCATENATE 'TESTFILE_' SY-DATUM '_' SY-UZEIT INTO LV_FILE.

"파일저장 경로
CONCATENATE '/sapmnt/' SY-SYSID '/ftp/' INTO LV_LODIR.
CONDENSE LV_LODIR NO-GAPS.

"파일명.TXT
CONCATENATE LV_FILE '.txt' INTO LV_FILEN.
"보낼 FILE 경로 + 이름
CONCATENATE LV_LODIR LV_FILEN INTO LV_FPATH.

"파일 생성
OPEN DATASET LV_FPATH IN TEXT MODE FOR OUTPUT ENCODING DEFAULT.

SELECT * INTO TABLE @DATA(ITAB)
  FROM T001.

" 파일 쓰기
LOOP AT ITAB ASSIGNING FIELD-SYMBOL(<FS>).
  TRANSFER <FS> TO LV_FPATH.
ENDLOOP.

" 파일생성 종료
CLOSE DATASET LV_FPATH.

" SFTP 전송
DATA : LV_CMAND LIKE SXPGCOLIST-NAME,
       LV_PARAM TYPE BTCXPGPAR,
       LT_CONTENT   TYPE TABLE OF BTCXPM WITH HEADER LINE.

LV_CMAND = 'ZSFTPTEST'. " SM69에서 설정한 이름
LV_PARAM = LV_FILEN.    " 파일명

CALL FUNCTION 'SXPG_COMMAND_EXECUTE'
  EXPORTING
    COMMANDNAME                   = LV_CMAND
    ADDITIONAL_PARAMETERS         = LV_PARAM
  TABLES
    EXEC_PROTOCOL                 = LT_CONTENT.

 

위 설정은 매번 파일명만 바뀐다는 가정하에 작성된 것이다. 만일 디렉토리까지 변경이 되면 다음과 같이 하면 된다.

우선 shell에서 DIR_SOURCE를 변수로 선언하지 말고 파라미터 1에 할당

DIR_SOURCE = "$1"

#!/bin/bash
USER="id"
PASS="password"
TARGET="ip"
PORT="port"
DIR_TARGET="/remote"

DIR_SOURCE = "$1"
FILE="$2"

## If filename is exist, then execute sftp. 
if [ -n "$2" ];
	then
	expect << EOF 
	spawn sftp -oPort=${PORT} ${USER}@${TARGET}
	expect "password:" { send "${PASS}\r"}
	expect "sftp>" { send "lcd ${DIR_SOURCE}\r"}
	expect "sftp>" { send "cd ${DIR_TARGET}\r"}
	expect "sftp>" { send "put ${FILE}\r"}
	expect "sftp>" { send "bye\r"}
	expect eof
	EOF
else
  echo "Please give me the filenames."
fi

 

Parameter에 SPACE로 $1, $2을 구분해서 넣어준다.

LV_CMAND = 'ZSFTPTEST'. " SM69에서 설정한 이름
" LV_LODIR: 디렉토리 LV_FILEN: 파일
CONCATENATE LV_LODIR LV_FILEN INTO LV_PARAM SEPARATED BY SPACE. 

CALL FUNCTION 'SXPG_COMMAND_EXECUTE'
  EXPORTING
    COMMANDNAME                   = LV_CMAND
    ADDITIONAL_PARAMETERS         = LV_PARAM
  TABLES
    EXEC_PROTOCOL                 = LT_CONTENT.
반응형