Bash, перенаправление stdout таких команд, как scp - PullRequest
7 голосов
/ 08 октября 2010

У меня есть скрипт bash с некоторыми командами scp внутри.Это работает очень хорошо, но, если я пытаюсь перенаправить мой стандартный вывод с помощью «. / Myscript.sh> log », в файле «log» отображаются только мои явные отклики.Вывод scp отсутствует.

if $C_SFTP; then
   scp -r $C_SFTP_USER@$C_SFTP_HOST:$C_SOURCE "$C_TMPDIR"
fi

Хорошо, что мне теперь делать?Спасибо

Ответы [ 4 ]

6 голосов
/ 08 октября 2010

scp использует интерактивный терминал для печати этого модного индикатора выполнения.Печать этого вывода в файл вообще не имеет смысла, поэтому scp определяет, когда его вывод перенаправлен куда-либо еще, кроме терминала, и отключает этот вывод.

Однако имеет смысл перенаправитьвывод ошибки в файл при наличии ошибок.Вы можете отключить стандартный вывод, если хотите.

Есть два возможных способа сделать это.Во-первых, вызвать ваш скрипт с перенаправлением как stderr, так и stdout в файл журнала:

./myscript.sh >log 2>&1

Во-вторых, это сказать bash, что нужно сделать это прямо в вашем скрипте:

#!/bin/sh

exec 2>&1

if $C_SFTP; then
   scp -r $C_SFTP_USER@$C_SFTP_HOST:$C_SOURCE "$C_TMPDIR"
fi

...

Если вам нужно проверить на наличие ошибок, просто убедитесь, что $? равно 0 после выполнения команды scp:

if $C_SFTP; then
   scp -r $C_SFTP_USER@$C_SFTP_HOST:$C_SOURCE "$C_TMPDIR"
   RET=$?
   if [ $RET -ne 0 ]; then
      echo SOS 2>&1
      exit $RET
   fi
fi

Другой вариант - сделать set -e в вашем скрипте, который сообщает bash-скрипту о необходимости отчетасбой, как только одна из команд в скриптах дает сбой:

#!/bin/bash

set -e

...

Надеюсь, это поможет.Удачи!

3 голосов
/ 17 октября 2013

Вы просто протестируете свой tty с помощью:

[ ~]#echo "hello" >/dev/tty
hello

Если это работает, попробуйте:

[ ~]# scp <user>@<host>:<source> /dev/tty 2>/dev/null

Это сработало для меня ...

2 голосов
/ 20 сентября 2012

К сожалению, выход SCP просто не может быть перенаправлен на стандартный вывод.

Я хотел получить среднюю скорость передачи моего SCP-перевода, и единственный способ, которым мне удалось это сделать, - это отправить stderr и stdout в файл, а затем снова отобразить файл в stdout.

Например:

#!/bin/sh
echo "Starting with upload test at `date`:"

scp -v -i /root/.ssh/upload_test_rsa /root/uploadtest.tar.gz speedtest@myhost:/home/speedtest/uploadtest.tar.gz > /tmp/scp.log 2>&1
grep -i bytes /tmp/scp.log
rm -f /tmp/scp.log

echo "Done with upload test at `date`."

Что приведет к следующему выводу:

Starting with upload test at Thu Sep 20 13:04:44 SAST 2012:
Transferred: sent 10191920, received 5016 bytes, in 15.7 seconds
Bytes per second: sent 650371.2, received 320.1
Done with upload test at Thu Sep 20 13:05:04 SAST 2012.
0 голосов
/ 06 декабря 2013

Я нашел грубое решение для scp:

$ scp -qv $USER@$HOST:$SRC $DEST

Согласно справочной странице scp, -q (тихо) отключает индикатор хода выполнения, а также отключает все остальные выходные данные. Также добавьте -v (многословно), вы получите кучу выходных данных ... и индикатор прогресса все еще отключен! Отключение индикатора выполнения позволяет перенаправить вывод в файл.

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

$ scp -qv $USER@$HOST:$SRC $DEST 2>&1 | grep -v debug

Окончательный вывод выглядит примерно так:

Executing: program /usr/bin/ssh host myhost, user (unspecified), command scp -v -f ~/file.txt
OpenSSH_6.0p1 Debian-4, OpenSSL 1.0.1e 11 Feb 2013
Warning: Permanently added 'myhost,10.0.0.1' (ECDSA) to the list of known hosts.
Authenticated to myhost ([10.0.0.1]:22).
Sending file modes: C0644 426 file.txt
Sink: C0644 426 file.txt
Transferred: sent 2744, received 2464 bytes, in 0.0 seconds
Bytes per second: sent 108772.7, received 97673.4

Кроме того, это можно перенаправить в файл:

$ scp -qv $USER@$HOST:$SRC $DEST 2>&1 | grep -v debug > scplog.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...