SFTP 데이터 경로에서 날짜 변수를 전달하는 방법은 무엇입니까?

SFTP 데이터 경로에서 날짜 변수를 전달하는 방법은 무엇입니까?

어제 날짜가 포함된 변수 값으로 경로를 만들어야 합니다. SFTP를 사용하여 파일을 가져와야 합니다. 이것이 나의 시도이다.

#/bin/bash

TS=$(date -d '30 mins ago' +"%Y%m%d")

sshpass -p '12#$' sftp -P 2222 [email protected] <<'END_SFTP'
get /newNE/PSData$TS*  /data/processedfiles
END_SFTP

그러나 TS데이터를 가져오기 위해 날짜 값이 원격 서버로 전달되지 않습니다.

File "/newNE/PSData$TS*" not found.

누구든지 이 문제를 해결하도록 도와줄 수 있나요?

답변1

이 문서 내에서 매개변수 확장(명령 대체, 산술 확장 및 줄 연속 처리 포함)을 수행하려면 구분 기호의 어떤 부분도 따옴표로 묶을 수 없습니다.

#! /bin/sh -

ts=$(date -d '30 mins ago' +"%Y%m%d")

SSHPASS='12#$' sshpass -e sftp -P 2222 [email protected] <<END_SFTP
get /newNE/PSData$ts* /data/processedfiles
END_SFTP

또한 참고하십시오:

  • ps암호는 일부 계정 로그의 출력이나 때로는 일부 계정 로그에서 공개적으로 사용 가능한 명령줄에서 전달되어서는 안 됩니다 . 일반적으로 비공개로 간주되므로 환경 변수로 전달하는 것이 좋습니다. 더 좋은 방법은 공개 키 인증을 사용하는 것입니다. 스크립트에 대한 읽기 액세스가 제한되어 있고 스크립트에 비밀번호가 포함되어 있는지 확인해야 합니다.
  • shebang으로 시작하고 #!통역사에 대한 경로가 이어집니다.추가하는 것도 -좋은 습관입니다.. 만약 그렇다면 그것은 단지 주석일 뿐이므로 스크립트를 해석하기 위해 #/bin/bashshebang 없이 시스템이 실행될 수 있습니다 .sh
  • 그러나 여기서는 스크립트에 특별한 내용이 없으므로 해당 종속성을 bash사용하고 제거하는 것이 좋습니다 (그리고 현재 사용 중인 시스템 이 아닌 한 스크립트를 실행할 때 더 적은 리소스를 사용할 수도 있습니다 ).shbash/bin/shbash
  • 여기서는 실제로 GNU date(비표준 -d옵션의 경우)에 의존하고 있습니다. 이는 bashbash(GNU 셸이지만 GNU가 아닌 시스템에서도 일반적임)보다 이식성이 훨씬 낮습니다. 를 사용하는 경우 as ( 이전 버전 뒤에 ) 를 bash정의하여 해당 종속성을 제거할 수 있습니다 .tsprintf -v ts '%(%Y%m%d)T' "$(( EPOCHSECONDS - 30 * 60 ))"printf -v EPOCHSECONDS '%(%s)T' -1bash

관련 정보