Назад | Перейти на главную страницу

SSH не перенаправляет stdout на локальный терминал

У меня есть следующие соответствующие строки в скрипте csh:

#!/bin/csh -xv
set dvar = `date +"^%m\/%d\/%y"`
set filedate = `date +%b%d%Y`
set grepstring = "grep "\"$dvar\"" </home/user/log/logfile"
set outstring = ">> serverlog_$filedate.txt"
grep "$dvar" <logfile >serverlog_$filedate.txt
ssh SERVER1 \"\"$grepstring\"\" $outstring

Первый grep в локальном файле журнала работает отлично, но grep SSH записывает свой вывод в удаленный каталог.

Строка выходит из командного файла как:

ssh SERVER1 ""grep "^01\/05\/10" <home/user/log/logfile"" >> serverlog_Jan052010.txt

Когда я набираю его (конечно, на один набор кавычек меньше), он работает нормально, я просто не могу заставить его работать из сценария csh.

Как заставить эту команду выводиться в указанный файл на локальном компьютере?

РЕДАКТИРОВАТЬ: Вот окончательный результат, который сработал благодаря womble:

#!/bin/csh
set dvar = `date +"%m\/%d\/%y"`
set filedate = `date +%b%d%Y`

grep "^$dvar" logfile > serverlog_$filedate.txt
ssh SERVER1 grep "^$dvar" /home/user/log/logfile >> serverlog_$filedate.txt

От этого сценария у меня кровоточит глаз. Избавьтесь от всех переменных, хранящих фрагменты команды (и ненужного перенаправления ввода на grep) и посмотрите, к чему это приведет. Цитирование почти наверняка ошибочно, о чем вы даже не догадываетесь. В оболочке Bourne я бы написал что-то вроде этого:

today="$(date +"%m\/%d\/%y")"
filetoday="$(date +%b%d%Y)"

grep "^$today" logfile > serverlog_${filetoday}.txt
ssh SERVER1 grep "^$today" /home/user/log/logfile >> serverlog_${filetoday}.txt

Если это вообще возможно:

  1. не используйте csh
  2. что делать Womble предлагает
  3. не используйте переменную для перенаправления, так как это не сработает

Если вам нужно изменить перенаправление, по крайней мере, в Bash и sh, вы можете:

file="/some/file"
if [ somecondition ]
then
    exec 3>&1            # send output of file descriptor 3 to stdout
elif [ condition2 ]
    exec 3>>"$file"      # append it to the file
else
    exec 3>"$file"       # overwrite the file        
fi
echo "text" >&3          # output to chosen location