installation_xx_int_${type}_*log
' ' 형식의 파일을 검색하려고 합니다 .현재 날짜원격 서버 내에서 다음 명령을 사용하십시오.
ssh user@hostname 'file=$(find ~ -type f -name "installation_xx_int_${type}_*log" -mtime -1 -exec basename "{}" \;); cat "$file"' > ~/$file
그러나 여기서 문제는 변수입니다.${유형}그리고$파일ssh 명령 내에서 확장되지 않으므로 파일 출력을 원격 서버에서 내 서버로 리디렉션할 수 없습니다.
이를 더 간단하게 달성할 수 있는 다른 방법이 있다면 알려주세요!
미리 감사드립니다!
답변1
쉘 변수는 마술처럼 전달되지 않습니다 ssh
. 일부 시스템에서는 이름이 로 시작하는 경우 환경 변수 전달을 허용하므로 LC_
다음을 수행할 수 있습니다.AcceptEnv LC_*
sshd_config
LC_type="$type" ssh -o SendEnv=LC_type user@hostname '
file=$(
find ~ -type f -name "installation_xx_int_${LC_type}_*log" -mtime -1 \
-exec basename "{}" \;
)
cat -- "$file"
' > ~/test.log
원격 셸의 구문(원격 셸이 POSIX와 유사한 경우 , , ) $type
에서 큰따옴표 안에 특수 문자를 포함하지 않으면 로컬 셸이 코드 인수에서 이를 다음으로 확장하도록 할 수 있습니다 ."
`
$
\
ssh
ssh user@hostname '
file=$(
find ~ -type f -name "installation_xx_int_'"$type"'_*log" -mtime -1 \
-exec basename "{}" \;
)
cat -- "$file"
' > ~/test.log
이러한 확장을 달성하려면 작은따옴표(로컬 쉘의 경우)를 제거하고 큰따옴표를 사용해야 합니다.
이들 모두에서 $type
와일드카드( *
, ?
, \
, )가 포함되면 패턴을 취하는 s에 의해 와일드카드로 처리되며 [...]
문자 그대로 이해하려면 와일드카드를 이스케이프 처리해야 합니다.find
-name
\
이 작업을 수행하는 대신 기본 이름을 사용하는 이유가 명확하지 않습니다.
ssh user@hostname '
find ~ -type f -name "installation_xx_int_'"$type"'_*log" -mtime -1 \
-exec cat {} +
' > ~/test.log
귀하의 질문에 대한 이후 편집에서 명확히 설명된 것처럼 원격 파일의 내용을 로컬 시스템에 있는 동일한 이름의 파일에 저장하려면 다음과 같이 해야 합니다(GNU 시스템이라고 가정합니다. pax
, star
(해당 부분은 직접 수행할 수도 있음 ) 또는 libarchive를 사용하여 find
유사한 작업을 수행 bsdtar
.
ssh user@hostname '
find ~ -type f -name "installation_xx_int_'"$type"'_*log" -mtime -1 -print0 |
tar --null -T - -cf - |
gzip -1' | tar --transform='s:.*/::' -zxf -
즉, 아카이브 형식을 사용하여 파일 경로와 콘텐츠를 저장합니다(그리고 tar
로컬 시스템에서 --transform
수신되면 tar
디렉터리 부분을 제거합니다).