【问题标题】:protect pipe character when executing an inline script on a remote server with ssh使用 ssh 在远程服务器上执行内联脚本时保护管道字符
【发布时间】:2011-12-12 22:40:20
【问题描述】:

我需要通过 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”变量声明。有什么建议吗?

提前致谢。

---- 编辑:澄清答案:

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;

【问题讨论】:

    标签: perl bash shell unix ssh


    【解决方案1】:

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

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

    【讨论】:

    • 不仅仅是变量,$(stat ...) 等也在本地计算机上执行。转义 $ 字符(即filedate=\$(stat -c %x \$myfile| ...)应该可以解决它。您可以通过将myvar=$(ssh user@server 替换为cat 来进行测试(并删除最后的右括号),它会打印发送到远程计算机的命令。
    • 尝试运行脚本,把shebang改成:#/bin/bash -x 看看是怎么回事,会显示变量的输出,是否满足条件
    • @GordonDavisson:正确。我应该比“你需要更多的转义”更明确。 :)
    • 修复很简单:在 EOF 的初始位置周围添加单引号。
    • @GordonDavisson,您在 cat 上对 var 进行故障排除的观点帮助很大,无论是伸缩式答案都有助于解决我的问题,谢谢!
    猜你喜欢
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    相关资源
    最近更新 更多