我正在尝试搜索格式为“ 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
,剥离目录部分)。