2010-10-08 69 views
5

我有一个bash脚本,里面有一些scp命令。 它工作得很好,但是,如果我尝试重新定向我的标准输出“./myscript.sh> log”,只有我的显式回应显示在“日志”文件中。 scp输出丢失。Bash,命令的标准输出重定向像scp

if $C_SFTP; then 
    scp -r [email protected]$C_SFTP_HOST:$C_SOURCE "$C_TMPDIR" 
fi 

好的,我现在该做什么? 谢谢

回答

5

scpscp正在使用交互式终端,以打印那个奇特的进度条。将输出打印到文件根本没有意义,因此scp会检测其输出何时重定向到终端以外的其他位置,并禁用该输出。

然而,有意义的是,如果有错误,将错误输出重定向到文件中。如果需要,您可能需要禁用标准输出。

有两种可能的方法来做到这一点。首先是两个标准错误重定向到调用脚本和标准输出到日志文件:

./myscript.sh >log 2>&1 

其次,是要告诉的bash脚本中的这样做的权利:

#!/bin/sh 

exec 2>&1 

if $C_SFTP; then 
    scp -r [email protected]$C_SFTP_HOST:$C_SOURCE "$C_TMPDIR" 
fi 

... 

如果您需要检查错误,只是验证$?0执行scp命令后:

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

另一种选择是做set -e y中我们的脚本告诉bash脚本尽快在脚本中的一条命令失败时报告失败:

#!/bin/bash 

set -e 

... 

希望它有帮助。祝你好运!

+1

'如果[ “$ RET” -ne “0”];那么......“不需要”在0附近,-ne/-eq“会测试整数值。 – Anders 2010-10-08 13:31:43

+0

@Anders:只是一种习惯,改变了这一点。 – 2010-10-08 13:39:59

2

不幸的是,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 [email protected]:/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. 
1

你的猫只是测试你的TTY:

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

如果这样的作品,尝试:

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

这对我有效...

0

我发现SCP一个粗略的解决方案:

$ scp -qv [email protected]$HOST:$SRC $DEST 

按照SCP手册页,-q(安静)禁用进度表,以及禁止所有其他输出。添加-v(详细),你会得到堆输出...和进度计仍然被禁用!禁用进度表允许您将输出重定向到文件。

如果你并不需要所有的认证调试输出,输出重定向到标准输出和grep出位,你不想:

$ scp -qv [email protected]$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 [email protected]$HOST:$SRC $DEST 2>&1 | grep -v debug > scplog.txt