scp 명령을 사용하여 특정 매개변수를 기반으로 server2(${Server} 매개변수가 됨)에서 server3으로 파일을 복사하는 책임이 있는 server1에서 스크립트를 실행 중입니다.
scp -p -qo StrictHostKeyChecking=no user@${Server}:/path/to/source/files/*${EAPdate}* user@hostname3:/path/to/destination/files/
스크립트 자체는 실행 시 로그를 생성해야 합니다. 모든 것이 예상대로 작동하고 EAPdate 매개변수가 예상대로 입력되면(YYYYMMDD) 복사 명령이 예상대로 작동합니다.
그러나 매개변수를 (DDMMYYYY)로 입력하면 복사 명령이 실패하고 "해당 파일 또는 디렉터리가 없습니다." 오류가 발생합니다.
스크립트는 다음과 같습니다.
#!/bin/bash
configuration_file=copy_EAP_files.ini
hostname=$(hostname)
script=$(basename "$0")
start_time=$(date)
start_seconds=${SECONDS}
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
LOGFILE="$(basename $0)_$(date +%Y.%m.%d_%H.%M.%S.log)"
LOGPATH=${DIR}"/logs"
mkdir -p ${LOGPATH}
echo_with_timestamp_and_log() {
message=$1
echo "$(date +"%Y.%m.%d %H:%M:%S") ${message}" | tee -a ${LOGPATH}/${LOGFILE}
}
log_time () {
echo -n "$(date +"%Y.%m.%d %H:%M:%S") "
}
read_parameter() {
variableToRead=$1
errorCodeToThow=$2
# read only lines begining with parameter name
result="$(grep "^$variableToRead" ./${configuration_file} | cut -d' ' -f2)"
if [ "${result}" == "" ]; then
echo_with_timestamp_and_log "ERROR ${2}: $1 variable not found in *.ini file"
exit $2
else
echo "${result}"
fi
}
echo_with_timestamp_and_log "Host: ${hostname}"
echo_with_timestamp_and_log "Script: ${script}"
echo_with_timestamp_and_log "Start time: ${start_time}"
echo_with_timestamp_and_log "______________ Script start _______________"
if [ "$#" -eq 0 ]; then
Server=$(read_parameter Server 101)
EAPdate=$(read_parameter EAPdate 102)
elif [ "$#" -eq 2 ]; then
Server=$1
EAPdate=$2
else
echo_with_timestamp_and_log "Illegal number of parameters"
exit 107
fi
echo_with_timestamp_and_log "server = ${Server}"
echo_with_timestamp_and_log "date = ${EAPdate}"
echo_with_timestamp_and_log "Connecting to AIS server ${Server}"
ssh -T $Server <<EOF | tee -a ${LOGPATH}/${LOGFILE}
$(typeset -f log_time)
log_time
echo "${Server}: Copying the EAP files to designated FTP path"
echo ""
echo "${Server}: Copying the files..."
scp -p -qo StrictHostKeyChecking=no user@${Server}:/path/to/source/files/*${EAPdate}* user@hostname3:/path/to/destination/files/
EOF
echo_with_timestamp_and_log "______________ Script end _________________"
elapsed_time=$((${SECONDS} - ${start_seconds}))
readable_time="$((${elapsed_time}/3600)) h $((${elapsed_time}%3600/60)) min"
echo_with_timestamp_and_log "Host: ${hostname}"
echo_with_timestamp_and_log "Script: ${script}"
echo_with_timestamp_and_log "End time: $(date)"
echo_with_timestamp_and_log "Duration: ${readable_time}"
이제 scp 스크립트에서 "해당 파일이나 디렉터리가 없습니다"라는 오류가 발생하면${EAPDate}매개변수를 사용하면 로그에 이 메시지가 캡처되지 않습니다. 이유를 모르겠습니다. 결과 로그는 스크립트가 실행되는 동안 화면에 표시되는 모든 메시지를 캡처하지 않습니다.
내가 무엇을 놓치고 있나요? 실행에 따라 로그에 다음 출력을 전달하려면 scp 명령을 어떻게 생성해야 합니까?
- 성공: echo "파일 복사 성공!"
- "해당 파일이나 디렉터리가 없습니다" 오류로 인해 실패했습니다. echo "파일이 성공적으로 복사되지 않았습니다. 소스 경로에 해당 파일이나 디렉터리가 없습니다!"
답변1
man bash
§ 파이프라인 에 따르면
|&를 사용하면 명령의 표준 오류가 표준 출력 외에도...에 연결됩니다.
교체해야 해
ssh -T $Server <<EOF | tee -a ${LOGPATH}/${LOGFILE}
통과
ssh -T $Server <<EOF |& tee -a ${LOGPATH}/${LOGFILE}