已关闭。此问题需要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'
型
它设法得到结果,但是如果我用完整的参数运行,就会出现缓冲区溢出。
1条答案
按热度按时间3qpi33ja1#
$file_date
的值在远程服务器上不可见,因为您使用的是单引号。解决这个问题的关键更改是使用双引号。您必须在内部切换到单引号(或者转义或引用其他引号)。字符串
参见Difference between single and double quotes in Bash
到
sort | head
的管道是相当内存密集的;当你需要的只是整体的最大值时,将所有的行保存在内存中以便它们可以被排序是多余的。所以下面的应该在内存方面更有效,运行更快。型
请注意,Awk脚本中的美元符号需要反斜杠转义,因为双引号将导致任何带有未转义美元符号的内容在
ssh
运行之前被本地shell作为变量进行计算。如果您不期望有大量的输出,可以在本地运行
sort
和head
,在这种情况下,管道周围不需要引用。型
.但是由于我预计
find
命令可能会产生大量的输出,所以我假设您希望远程运行整个管道,并且只通过ssh
连接将最终结果发送回来。我将再次强调,这只运行
ssh find
,然后将输出通过管道返回到本地shell,后者通过sort
和head
在本地运行管道。(And即使这样,上面的Awk脚本也可能比将所有接收到的行同时保存在内存中更好,这样就可以对它们进行排序。)
还要注意
-printf
的参数如何需要用双引号引起来(如双引号和单引号;或者您可以反斜杠转义空格),以使其在本地和远程shell中都保持为单个字符串。