2010-10-08 101 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