2016-04-27 38 views
1

我想从本地服务器(服务器A)上运行的脚本从远程服务器(服务器B)在特定时间范围内复制一组文件。 我在find中使用-newermt选项来指定我的时间范围。 所以,如果我ssh到远程服务器(服务器B)这工作:传递变量通过ssh查找-newermt选项

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)involke这样的:

#!/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 [email protected] find /appl/backup/monsters/${CLUSTER}/${node}/${STIME}/jelly/ -newermt "$T1" \\! -newermt "$T2" 
echo $latest_file 
echo SCP Completed. 
exit 

这给了我一个发现错误:

发现:路径必须先表达:07: 40:00

这样看来,用这种方法发现不喜欢在空间“2016年4月26日7时四十分00秒”

我试图转换为unixtimestamps避免使用如步伐却发现不喜欢那些:

发现:我无法弄清楚如何解释'1461678000' 作为一个日期或时间

我的问题是我必须划定空格字符这个或大括号,我正在尝试一些事情,但完全摸不着头脑: - /任何帮助表示赞赏。

谢谢!

+1

您需要引号才能被* remote *服务器看到,而不是本地引用。用双引号引用* entire *'find'命令,并在当前有双引号的地方使用单引号。 –

+0

就是这样,非常感谢! –

回答

0

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

您使用周围"$T1""$T2"被去除由本地shell运行ssh命令,但远程命令在此之前没有引号保护空间从远程shell双引号。

所以当地的外壳看到:

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

但远程shell看到:

[ssh] [[email protected]] [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 [email protected] "find '/appl/backup/monsters/${CLUSTER}/${node}/${STIME}/jelly/' -newermt '$T1' \! -newermt '$T2'"