Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 使用ssh在远程服务器上执行内联脚本时保护管道字符_Perl_Bash_Shell_Unix_Ssh - Fatal编程技术网

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

Perl 使用ssh在远程服务器上执行内联脚本时保护管道字符,perl,bash,shell,unix,ssh,Perl,Bash,Shell,Unix,Ssh,我需要通过ssh在远程服务器上执行脚本,我无法在远程服务器上找到作为文件的脚本,也无法在脚本过程中创建文件 脚本将检查不存在的文件或零字节文件,如果存在,则检查文件是否过期 我遵循并尝试了以下方法: 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);

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

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

我遵循并尝试了以下方法:

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
)
也许就是不能使用“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
keber笔记本电脑:~keberflores$echo$myvar
凯伯笔记本电脑:~keberflores$myvar=$(ssh)user@server如果[-s\$myfile];则
>filedate=\$(stat-c%x\$myfile | grep'[0-9\-]*'--最大计数=1-o);
>昨天=\$(日期——日期‘现在——1天’——iso-8601);
>如果[\$filedate<\$Dayed];则
>echo'1'\$昨天;
>否则
>回音“0 ok”;
>fi
>否则
>echo“1”\$(日期——iso-8601);
>fi
>EOF
> )
不会分配伪终端,因为stdin不是终端。
user@server的密码:
凯伯笔记本电脑:~keberflores$echo$?
0
凯伯笔记本电脑:~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;

my$myvar=qx'sshuser@server你需要更多的逃逸才能让它发挥作用。bash将在本地计算here文件中的变量等,然后在远程服务器上计算结果


特别是,当计算here文件时,您的
$myfile
可能计算为空字符串,导致stat没有文件参数。

这不仅仅是变量,
$(stat…
)等也在本地计算机上执行。转义
$
字符(即
filedate=\$(stat-c%x\$myfile |…
)应该可以解决这个问题。您可以通过替换
myvar=$(ssh)进行测试user@server
cat
(并删除最后的右括号),它将按发送到远程计算机的方式打印命令。尝试运行脚本并将shebang更改为:#/bin/bash-x要查看发生了什么,它将显示变量的输出以及条件是否正确met@GordonDavisson:正确。我应该说得比“你需要更多的逃避”更清楚:)解决方法很简单:在
EOF
@GordonDavisson的初始出现处添加单引号,您关于cat的VAR故障排除的观点帮助很大,这两种方法都有助于解决我的问题,谢谢!
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;