Как лучше всего записывать и записывать вывод 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 без отображения на консоли.