защитить символ канала при выполнении встроенного скрипта на удаленном сервере с помощью ssh - PullRequest
1 голос
/ 22 октября 2011

Мне нужно выполнить скрипт на удаленном сервере через ssh, я не могу найти скрипт как файл на удаленном сервере и не создавать файлы во время процесса скрипта.

Скрипт проверяет наличиесуществующий или нулевой байтовый файл, и, если существует, проверяет, устарел ли он.

Я следил за потоком здесь на 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

, возможно, просто не может использовать объявление var 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;

1 Ответ

3 голосов
/ 22 октября 2011

Вам нужно больше бежать, чтобы заставить это работать. bash будет оценивать переменные и т. д. в файле here-файла локально, а затем результат будет оценен на удаленном сервере.

В частности, ваш $myfile, вероятно, вычисляет пустую строку, когда вычисляется здесь-файл, что приводит к тому, что stat не имеет аргумента файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...