无法扩展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

Shell 变量不会神奇地通过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

如果$type不包含远程 shell 语法中双引号内的特殊字符(", `, $\如果远程 shell 类似于 POSIX),则可以让本地 shell 在代码参数中将其扩展为ssh

ssh user@hostname '
  file=$(
    find ~ -type f -name "installation_xx_int_'"$type"'_*log" -mtime -1 \
      -exec basename "{}" \;
  )
  cat -- "$file"
' > ~/test.log

为了实现这种扩展,我们需要摆脱单引号(对于本地 shell)并使用双引号。

在所有这些中,如果$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(也可以find自己完成该部分)或 libarchive执行类似的操作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,剥离目录部分)。

相关内容