SSH 내에서 변수를 확장할 수 없습니다.

SSH 내에서 변수를 확장할 수 없습니다.

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디렉터리 부분을 제거합니다).

관련 정보