我有一个包含一些scp命令的bash脚本。 它运行得很好但是,如果我尝试使用“ ./ myscript.sh> log ”重定向我的标准输出,则只有我的显式回声显示在“日志”文件中。 缺少scp输出。
if $C_SFTP; then
scp -r $C_SFTP_USER@$C_SFTP_HOST:$C_SOURCE "$C_TMPDIR"
fi
好的,我现在该怎么办? 谢谢
答案 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