Bash,stdout重定向命令,如scp

Bash,stdout重定向命令,如scp,bash,redirect,stdout,Bash,Redirect,Stdout,我有一个bash脚本,里面有一些scp命令。 它工作得很好,但是如果我尝试用“/myscript.sh>log”重定向我的stdout,那么“log”文件中只显示我的显式回显。 缺少scp输出 if $C_SFTP; then scp -r $C_SFTP_USER@$C_SFTP_HOST:$C_SOURCE "$C_TMPDIR" fi 好的,我现在该怎么办? 谢谢scp正在使用交互式终端来打印那个奇特的进度条。将该输出打印到文件根本没有意义,因此scp会检测其输出何时重定向到终端以

我有一个bash脚本,里面有一些scp命令。 它工作得很好,但是如果我尝试用“/myscript.sh>log”重定向我的stdout,那么“log”文件中只显示我的显式回显。 缺少scp输出

if $C_SFTP; then
   scp -r $C_SFTP_USER@$C_SFTP_HOST:$C_SOURCE "$C_TMPDIR"
fi
好的,我现在该怎么办?
谢谢

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

...

希望能有帮助。祝你好运

不幸的是,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.

您只需通过以下方式测试您的tty:

[ ~]#echo "hello" >/dev/tty
hello
如果有效,请尝试:

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

这对我很有用…

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

$ scp -qv $USER@$HOST:$SRC $DEST
根据scp手册页,
-q
(安静)禁用进度表,以及禁用所有其他输出。添加
-v
(详细)同样,您会得到成堆的输出。。。而进度表仍处于禁用状态!禁用进度表允许您将输出重定向到文件

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

$ 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

if[“$RET”-ne“0”];那么..
就不需要“大约0,
-ne/-eq
将测试整数值。@安德斯:只是一种习惯。我试图过滤掉“永久添加到已知主机列表”消息,但想显示传输信息。重定向到
/dev/tty
对我来说很有效:
scp-o strichostkeychecking=no localfile remotesystem:/dir/remotefile 2>&1>/dev/tty | grep-v“警告:永久添加了”
。如果在将stdout传输到grep之前将stderr重定向到stdout(
2>&1
),则不需要临时文件,例如:
scp-v。。。2> &1 | grep-i字节