perl - 使用ssh在远程服务器上执行内联脚本时保护管道字符

标签 perl bash shell unix ssh

我需要通过ssh在远程服务器上执行脚本,我无法在远程服务器上将脚本作为文件找到,也无法在脚本过程中创建文件。

该脚本检查不存在或零字节的文件,如果存在,则检查是否过时。

我关注了a thread here on SO并尝试了以下操作:

myvar=$(ssh user@server <<EOF
myfile=/mnt/file.csv
if [ -s $myfile ]; then
   filedate=$(stat -c %x $myfile|grep '[0-9\-]*' --max-count=1 -o);
   yesterday=$(date --date 'now -1 day' --iso-8601);
   if [ $filedate < $yesterday ]; then
     echo '1 '$yesterday;
   else
     echo '0 ok';
   fi
else
   echo $(date --iso-8601);
fi
EOF
)

可悲的是,管道似乎正在截断字符串或​​其他内容,因为脚本返回
stat: too few arguments

也许只是不能使用“myfile” var声明。有什么建议么?

提前致谢。

----编辑:澄清答案:
keber-laptop:~ keberflores$ echo $myvar

keber-laptop:~ keberflores$ myvar=$(ssh user@server <<EOF
> myfile=/mnt/file.csv
> if [ -s \$myfile ]; then
>    filedate=\$(stat -c %x \$myfile|grep '[0-9\-]*' --max-count=1 -o);
>    yesterday=\$(date --date 'now -1 day' --iso-8601);
>    if [ \$filedate < \$yesterday ]; then
>      echo '1 '\$yesterday;
>    else
>      echo '0 ok';
>    fi
> else
>    echo '1 '\$(date --iso-8601);
> fi
> EOF
> )
Pseudo-terminal will not be allocated because stdin is not a terminal.
user@server's password: 
keber-laptop:~ keberflores$ echo $?
0
keber-laptop:~ keberflores$ echo $myvar
1 2011-10-22

----编辑:在perl内部调用:
my $myvar = qx'ssh user@server <<\'EOF\'
myfile=/mnt/file.csv
if [ -s $myfile ]; then
   filedate=$(stat -c %x $myfile|grep \'[0-9\-]*\' --max-count=1 -o);
   yesterday=$(date --date \'now -1 day\' --iso-8601);
   if [ $filedate < $yesterday ]; then
     echo \'1 \'$yesterday;
   else
     echo \'0 ok\';
   fi
else
   echo \'1 \'$(date --iso-8601);
fi
EOF
';
print $myvar;

最佳答案

您需要进行更多的转义才能使其正常工作。 bash将在本地评估here文件中的变量等,然后将在远程服务器上评估其结果。

特别是,在对here文件进行评估时,您的$myfile可能评估为空字符串,从而导致stat没有文件参数。

关于perl - 使用ssh在远程服务器上执行内联脚本时保护管道字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7855924/

相关文章:

linux - 我不小心执行了 ulimit -r1,并且想返回 ulimit -r90+,我该怎么做?

c++ - 执行 Shell 命令时的性能问题

visual-studio - 如何设置Visual Studio 2008以在Perl中编程?

perl - 调用两次时给出两个不同输出的子程序

bash - 如何转义 bash 中的 '@' 符号?

shell - hdfs 删除超过 7 天的目录

javascript - Nodejs ssh2仅在一个终端运行多个命令

MySQL 随机查询生成器输出含义

perl - TCP Server 多次接收和响应

linux - 编写 shell 脚本以将一个文件的内容查找到另一个文件中并显示所有出现的情况