Как лучше всего записывать и записывать вывод scp?

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

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

Копирование /user 2/cdb/builds/tmp/uat/myfiles/* to server/users/myfiles как cdb

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

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

Копирование /user 2/cdb/builds/tmp/uat/myfiles/* to server/users/myfiles как cdb

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

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

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

Спасибо.

Ответ 1

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

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

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

scp myfile [email protected]:. && echo success!

man scp говорит

scp exits with 0 on success or >0 if an error occurred.

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

scp myfile [email protected]:. && echo success! 

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

scp myfile [email protected]:. && echo myfile successfully copied! >> logfile 2>&1

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

Ответ 5

да, я недавно пытался получить выход в PHP скрипт из proc_open() я потерял тихое время, пытаясь получить выход:-) но его немного поздно здесь, и я, читая это сообщение, заставило меня понять, что мне действительно не нужен этот junky-вывод для моего script

только код выхода выполнит задание: -)

$exit_code = proc_close ($ process);

Ответ 6

Попробуйте:

scp server:/file /tmp/ > /dev/tty

Ответ 7

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

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

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

EDIT: он действительно порождает оболочку, поэтому, если вам нужны вещи для запуска (и действительно неудачно) последовательно (например, в сборке script), вам придется добавить некоторую логику вокруг использования script.

то есть.

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

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

Ответ 8

$ grep -r "Error" xyz.out > abc.txt

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

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