我需要通过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
也许只是不能使用&#34; myfile&#34; 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;
答案 0 :(得分:3)
你需要更多的逃避才能让它发挥作用。 bash将在本地文件中评估变量等,然后在远程服务器上评估其结果。
特别是,在评估here文件时,$myfile
可能正在评估空字符串,导致stat没有文件参数。