【问题标题】:pass variable to find via ssh for -newermt option传递变量以通过 ssh 查找 -newermt 选项
【发布时间】:2016-08-21 22:34:36
【问题描述】:

我正在尝试使用在本地服务器(服务器 A)上运行的脚本从远程服务器(服务器 B)复制特定时间范围内的一组文件。 我在 find 中使用 -newermt 选项来指定我的时间范围。 因此,如果我 ssh 到远程服务器(服务器 B),这可行:

find /appl/backup/monsters/green/y.y.y.y/2016-04-26_08-00-01/jelly/ -newermt "2016-04-26 07:40:00" \! -newermt "2016-04-26 07:50:00"

我得到指定时间的文件列表。

但是,如果我尝试通过 ssh 从本地服务器(服务器 A)调用它:

#!/bin/bash
#           
CLUSTER="green"
node="x.x.x.x"
STIME="2016-04-26_08-00-01" 
#T1=1461678000
#T2=1461678600
T1="2016-04-26 07:40:00"
T2="2016-04-26 07:50:00"             
ssh user@y.y.y.y find /appl/backup/monsters/${CLUSTER}/${node}/${STIME}/jelly/ -newermt "$T1" \\! -newermt "$T2"
echo $latest_file
echo SCP Completed.
exit

这给了我一个查找错误:

查找:路径必须在表达式之前:07:40:00

所以看来用这个方法 find 不喜欢 "2016-04-26 07:40:00" 中的空格

我尝试转换为 unixtimestamps 以避免使用空格,但 find 不喜欢那些:

发现:我不知道如何将 `1461678000' 解释为日期或时间

我的问题是我是否必须为此或大括号分隔空格字符,我正在尝试一些事情但完全摸索:-/感谢任何帮助。

谢谢!

【问题讨论】:

  • 您需要 remote 服务器而不是本地服务器看到引号。将整个 find 命令用双引号括起来,并在当前有双引号的地方使用单引号。
  • 就是这样,非常感谢!

标签: bash ssh find scp


【解决方案1】:

问题是您在本地引用而不是在远程引用。

在运行ssh 命令之前,本地shell 将删除您在"$T1""$T2" 周围使用的双引号,但是远程命令没有引号保护远程shell 的空间。

所以本地shell看到:

[ssh] [user@y.y.y.y] [find] [/appl/backup/monsters/${CLUSTER}/${node}/${STIME}/jelly/] [-newermt] [2016-04-26 07:40:00] [\!] [-newermt] [2016-04-26 07:50:00]

但远程 shell 可以看到:

[ssh] [user@y.y.y.y] [find] [/appl/backup/monsters/${CLUSTER}/${node}/${STIME}/jelly/] [-newermt] [2016-04-26] [07:40:00] [\!] [-newermt] [2016-04-26] [07:50:00]

这就是问题所在。

-newermt 的参数被视为2016-04-2607:40:00 被视为一个杂散的参数,find 将其视为一个路径,因此它会给您“路径必须先出现”错误。

您需要用引号将其传递到远程端,因此对整个字符串进行双引号(以允许在本地进行变量扩展),然后在远程 shell 的扩展值周围使用单引号。

ssh user@y.y.y.y "find '/appl/backup/monsters/${CLUSTER}/${node}/${STIME}/jelly/' -newermt '$T1' \! -newermt '$T2'"

【讨论】:

    猜你喜欢
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 2023-03-11
    • 1970-01-01
    • 2012-09-20
    • 2011-10-08
    • 2017-07-30
    相关资源
    最近更新 更多