Bash,stdout重定向命令,如scp

时间:2010-10-08 13:11:42

标签: bash redirect stdout

我有一个包含一些scp命令的bash脚本。 它运行得很好但是,如果我尝试使用“ ./ myscript.sh> log ”重定向我的标准输出,则只有我的显式回声显示在“日志”文件中。 缺少scp输出。

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

好的,我现在该怎么办? 谢谢

4 个答案:

答案 0 :(得分:6)

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

...

如果您需要检查错误,请在执行scp命令后验证$?是否为0

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

...

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

答案 1 :(得分:3)

你只需用以下方法测试你的tty:

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

如果有效,请尝试:

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

这对我有用......

答案 2 :(得分:2)

不幸的是,SCP的输出不能简单地重定向到stdout。

我想获得我的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.

答案 3 :(得分:0)

我找到了scp的粗略解决方案:

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

根据scp手册页,-q(安静)禁用进度表,并禁用所有其他输出。添加-v(详细),您将获得大量输出...并且进度表仍然被禁用!禁用进度表可以将输出重定向到文件。

如果您不需要所有身份验证调试输出,请将输出重定向到stdout并grep out您不需要的位:

$ 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