Как лучше всего захватывать и регистрировать вывод scp? - PullRequest
15 голосов
/ 14 октября 2008

Я пытаюсь перехватить вывод скрипта установки (использующего scp) и записать его. Однако я не получаю все, что печатает scp, а именно индикатор выполнения.

вывод на экран:

Копирование / user2 / cdb / builds / tmp / uat / myfiles / * для сервер / пользователи / myfiles как cdb

cdb @ пароль сервера: myfile 100% | ***************************** | 2503 00: 00

вывод журнала:

Копирование / user2 / cdb / builds / tmp / uat / myfiles / * для сервер / пользователи / myfiles как cdb

Мне бы очень хотелось знать, что мой файл туда попал. Вот что я пытаюсь сейчас безрезультатно:

myscript.sh 2> & 1 | tee mylogfile.log

У кого-нибудь есть хороший способ перехватить вывод scp и записать его?

Спасибо.

Ответы [ 8 ]

24 голосов
/ 17 октября 2012

scp выводит свой индикатор выполнения на терминал, используя управляющие коды. Он обнаружит, перенаправляете ли вы вывод и тем самым пропустите индикатор выполнения.

Вы можете обойти это, обманывая scp, думая, что он запускается в терминале с помощью команды «script», которая по умолчанию установлена ​​в большинстве дистрибутивов:

script -q -c "scp server:/file /tmp/" > /tmp/test.txt

Содержимое test.txt будет:

file    0%    0     0.0KB/s   --:-- ETA
file   18%   11MB  11.2MB/s   00:04 ETA
file   36%   22MB  11.2MB/s   00:03 ETA
file   54%   34MB  11.2MB/s   00:02 ETA
file   73%   45MB  11.2MB/s   00:01 ETA
file   91%   56MB  11.2MB/s   00:00 ETA
file  100%   61MB  10.2MB/s   00:06

... что, вероятно, то, что вы хотите.

Я наткнулся на эту проблему, перенаправляя вывод интерактивного скрипта в файл журнала. Отсутствие результатов в журнале не было проблемой, так как вы всегда можете оценить коды выхода. Но я действительно хотел, чтобы интерактивный пользователь увидел индикатор выполнения. Этот ответ решает обе проблемы.

8 голосов
/ 14 октября 2008

Похоже, вы просто не заметили, был ли успешным scp из журнала.

Я предполагаю, что полоса прокрутки не печатает на стандартный вывод и использует ncurses или какой-либо другой TUI?

Вы можете просто посмотреть на возвращаемое значение scp, чтобы увидеть, было ли оно успешным. Нравится

scp myfile user@host.com:. && echo success!

man scp говорит

scp exits with 0 on success or >0 if an error occurred.
1 голос
/ 06 февраля 2015

Я пока не могу комментировать :( поэтому я добавлю обновление здесь ...

@ У Мартина было лучшее решение для меня, хотя, если ваша команда scp находится в середине вашего скрипта, то ее вывод может появляться после команд, которые фактически выполнялись впоследствии.

Я думаю, это потому, что скрипт должен выполнить команду в подоболочке, но я еще не тестировал.

РЕДАКТИРОВАТЬ: он действительно порождает оболочку, так что если вам нужно, чтобы что-то запускалось (и действительно не выполнялось) последовательным образом (как в сценарии сборки), тогда вам придется добавить некоторую логику вокруг использования команды script.

1011 * т.е. *

script -q -c "ваша команда" && sleep 1

или что-то подобное, так что ваша родительская оболочка ожидает завершения дочерней оболочки, прежде чем двигаться дальше.

1 голос
/ 28 октября 2014

Попробуйте:

scp server:/file /tmp/ > /dev/tty
1 голос
/ 03 июля 2014
scp myfile user@host.com:. && echo success! 

очень полезно, но чтобы записать сообщение в файл журнала, я изменил его следующим образом

scp myfile user@host.com:. && echo myfile successfully copied! >> logfile 2>&1

и будет написано "myfile успешно скопирован!" сообщение в файл журнала.

1 голос
/ 14 октября 2008

Может быть, вы можете использовать ' script ' для регистрации сеанса терминала.

0 голосов
/ 31 мая 2016
$ grep -r "Error" xyz.out > abc.txt

Здесь в приведенной выше команде я сохраняю вывод в файл abc.txt.

Эта команда grep предназначена для поиска текста, связанного с Ошибка в файле xyz.out и сохранения вывода в abc.txt без отображения на консоли.

0 голосов
/ 12 августа 2009

да, я недавно пытался получить вывод в сценарии php от proc_open () я потерял время, пытаясь получить вывод :-) но здесь немного поздно, и тогда я прочитал этот пост, и я понял, что мне не нужен этот бесполезный вывод в мой сценарий

только код выхода сделает работу: -)

$ exit_code = proc_close ($ process);

...