어제 날짜가 포함된 변수 값으로 경로를 만들어야 합니다. 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/bash
shebang 없이 시스템이 실행될 수 있습니다 .sh
- 그러나 여기서는 스크립트에 특별한 내용이 없으므로 해당 종속성을
bash
사용하고 제거하는 것이 좋습니다 (그리고 현재 사용 중인 시스템 이 아닌 한 스크립트를 실행할 때 더 적은 리소스를 사용할 수도 있습니다 ).sh
bash
/bin/sh
bash
- 여기서는 실제로 GNU
date
(비표준-d
옵션의 경우)에 의존하고 있습니다. 이는bash
bash(GNU 셸이지만 GNU가 아닌 시스템에서도 일반적임)보다 이식성이 훨씬 낮습니다. 를 사용하는 경우 as ( 이전 버전 뒤에 ) 를bash
정의하여 해당 종속성을 제거할 수 있습니다 .ts
printf -v ts '%(%Y%m%d)T' "$(( EPOCHSECONDS - 30 * 60 ))"
printf -v EPOCHSECONDS '%(%s)T' -1
bash