Прямой stderr в файл по ssh

Я пытаюсь выполнить команду на локальном компьютере и направить stderr на удаленный компьютер поверх ssh. Я не могу

ssh remote machine "command 2>stderr.log" 

потому что удаленный компьютер не имеет правильного построения для выполнения команды, и мне нужно запустить команду на моем локальном компьютере. Я еще не пробовал, но я в основном уверен, что мы не можем сделать 2>ssh local machine /dir/stderr.log ?

  • Неудачное решение от «Как перенаправить stdout и stderr в файл и отобразить stderr для консоли»
  • Запуск сценария, когда процесс выдает сообщение stderr
  • stdin, stderr, перенаправление и журналы
  • Когда использовать стандартный поток ошибок в приложении командной строки?
  • Как получить вывод команды timeout без использования сценария оболочки
  • Возможно ли создать липкое перенаправление из stdout / stderr
  • Как использовать gpsdecode для вывода результатов gpscat читаемым образом?
  • Использование find -exec и проблемы с перенаправлением стандартной ошибки
  • 2 Solutions collect form web for “Прямой stderr в файл по ssh”

    Как я понимаю, вы хотите запустить команду локально, но сохраните вывод stderr в файл удаленного журнала.

    Попробуйте заменить процесс :

     local_command 2> >(ssh somemachine 'cat >logfile') 

    Здесь >(...) является заменой процесса . Он создает файл-подобный объект из команды в parens. Итак, 2> перенаправляет stderr на этот файл-подобный объект, в результате чего вывод сохраняется на удаленном компьютере.

    Или просто используйте обычное перенаправление:

     { local_command 2>&1 1>&3 | ssh somemachine 'cat >logfile'; } 3>&1 

    Здесь stderr перенаправляется на stdout, чтобы мы могли передать его в ssh. Так что stdout не переходит в ssh, мы перенаправляем его на дескриптор файла 3. В конце команды дескриптор файла 3 перенаправляется на stdout, чтобы он отображался на терминале.

    Если вам не нужно отслеживать stderr процесса во время его работы, вы можете использовать временный локальный файл, например

     #!/bin/bash tmpfile=`mktemp` trap '/bin/rm -f $tmpfile ; exit' 0 1 2 3 15 run_command 2> $tmpfile if [ -s $tmpfile ] then scp $tmpfile remoteserver:logfile fi exit 0 

    Если вам нужны «живые» данные, тогда у вас проблемы с буферизацией; отправка stderr над ssh не может быть буферизированной, и поэтому вся эта концепция может быть не лучшим способом ее выполнения.

    Linux и Unix - лучшая ОС в мире.