linux 在远程服务器(ssh)特定模式文件名中查找时间戳[已关闭]

7fyelxc5  于 5个月前  发布在  Linux
关注(0)|答案(1)|浏览(57)

已关闭。此问题需要details or clarity。目前不接受回答。
**要改进此问题吗?**通过editing this post添加详细信息并阐明问题。

上个月关门了。
Improve this question
我需要创建一个脚本,该脚本应根据服务器A上的服务器B的文件名模式获取最新文件。
我在服务器B上运行的命令如下(服务器A是103.11.34.111):

ssh [email protected] 'find /data/path -name "CDR*$file_date" -printf "%TY-%Tm-%Td %TH:%TM:%.2TS\n" | sort -rn | head -1'

字符串
$file_date是一个变量,用于定义YYYYMMDD格式的日期
当我运行./myscript.sh时,我得到如下错误

*** buffer overflow detected ***: ssh terminated


我怀疑我的命令有问题,因为如果我运行命令,

ssh [email protected] 'find /data/path -name "CDR*$file_date" | sort -rn | head -1'


ssh [email protected] 'find /data/path -printf "%TY-%Tm-%Td %TH:%TM:%.2TS\n" | sort -rn | head -1'


它设法得到结果,但是如果我用完整的参数运行,就会出现缓冲区溢出。

3qpi33ja

3qpi33ja1#

$file_date的值在远程服务器上不可见,因为您使用的是单引号。解决这个问题的关键更改是使用双引号。您必须在内部切换到单引号(或者转义或引用其他引号)。

ssh [email protected] "find /data/path -name 'CDR*$file_date' -printf '%TY-%Tm-%Td %TH:%TM:%.2TS\n' | sort -rn | head -1"

字符串
参见Difference between single and double quotes in Bash
sort | head的管道是相当内存密集的;当你需要的只是整体的最大值时,将所有的行保存在内存中以便它们可以被排序是多余的。所以下面的应该在内存方面更有效,运行更快。

ssh [email protected] "find /data/path -name 'CDR*$file_date' -printf '"%TY-%Tm-%Td %TH:%TM:%.2TS\n"' |
    awk '\$0 > n { n = $0 } END { print n }'"


请注意,Awk脚本中的美元符号需要反斜杠转义,因为双引号将导致任何带有未转义美元符号的内容在ssh运行之前被本地shell作为变量进行计算。
如果您不期望有大量的输出,可以在本地运行sorthead,在这种情况下,管道周围不需要引用。

ssh [email protected] find /data/path -name "CDR*$file_date" -printf "'%TY-%Tm-%Td %TH:%TM:%.2TS\n'" |
sort -rn | head -1


.但是由于我预计find命令可能会产生大量的输出,所以我假设您希望远程运行整个管道,并且只通过ssh连接将最终结果发送回来。
我将再次强调,这只运行ssh find,然后将输出通过管道返回到本地shell,后者通过sorthead在本地运行管道。
(And即使这样,上面的Awk脚本也可能比将所有接收到的行同时保存在内存中更好,这样就可以对它们进行排序。)
还要注意-printf的参数如何需要用双引号引起来(如双引号和单引号;或者您可以反斜杠转义空格),以使其在本地和远程shell中都保持为单个字符串。

相关问题