重定向到文件的标准输出显示与实际

时间:2016-02-03 09:11:06

标签: python shell io

在我的下面的程序中,输出被重定向到文件test1.txt,但是当我打开文件时,我有三个问题:

  1. 我看到像ls,pwd这样的命令在提示符下面(sw0:FID128:root>)。
  2. 提示符应显示“sw0:FID128:root>”但它显示“sw0:FID128:root”
  3. 如果实际输出有2个选项卡,则该文件仅显示1个选项卡。
  4. 我基本上希望它与另一个文件进行比较,因此如果选项卡的数量不同,它将会失败。

     telconn=pexpect.spawn('telnet 10.24.12.109')
     telconn.logfile = sys.stdout
     telconn.expect(":")
     telconn.send("user" + "\r")
     telconn.expect(":")
     telconn.send("pass" + "\r\r\r\r\n\n\n")
     telconn.expect("key to proceed.")
     telconn.send ("\003")
     telconn.expect("root>")
     prev_std= sys.stdout
     sys.stdout=open("test1.txt","w")
    
     print "Telnet connection is done"
    
     telconn.sendline('\n');
     telconn.expect (['>',pexpect.EOF])
     ls = telconn.before
    
     telconn.sendline('ls -al');
     telconn.expect (['>',pexpect.EOF])
     ls = telconn.before
    
     telconn.sendline('pwd');
     telconn.expect (['>',pexpect.EOF])
     pwd = telconn.before
    
     telconn.sendline('noscli');
     telconn.expect (['#',pexpect.EOF])
     nos = telconn.before
    
     telconn.sendline('terminal length 0');
     telconn.expect (['#',pexpect.EOF])
     term = telconn.before
    
     telconn.sendline('\n\n');
    
     telconn .sendline('exit');
     telconn.close()
    
     print ls
     print pwd
     print nos
     print term
    
     #print "Ended session"
    
    
     sys.stdout.close()
     sys.stdout =prev_std
    
     fo = open("test1.txt", "r+")
     str = fo.read();
     print "Read String is : ", str
     # Close opend file
     fo.close()
    

    示例输出如下所示

    Telnet connection is done
     ^M
    sw0:FID128:root
     ls -al^M
    total 32^M
    pwddrwx------  3 root root 4096 Feb  2 11:07 ./^M
    ^M
    drwxr-xr-x 28 root root 4096 Feb  3 05:58 ../^M
    -rw-r--r--  1 root sys   507 Feb  1 06:47 .bash_logout^M
    -rw-r--r--  1 root sys    27 Feb  1 06:47 .inputrc^M
    -rw-r--r--  1 root sys  1220 Feb  1 06:47 .profile^M
    -rw-r--r--  1 root sys  2551 Feb  1 06:47 .rhosts^M
    drwxr-xr-x  2 root sys  4096 Feb  1 09:51 .ssh/^M
    -rw-r--r--  1 root sys   617 Feb  1 06:47 .toprc^M
    -rw-r--r--  1 root root    0 Feb  3 06:01 mcast_trc^M
    -rw-r--r--  1 root root    0 Feb  3 06:01 sysdiag_trc^M
    sw0:FID128:root
     pwd^M
    /root^M
    

1 个答案:

答案 0 :(得分:0)

  

我看到像ls,pwd这样的命令在提示符

下面

您的输出的换行符不一致(^MCR)。这意味着您的整体的某些部分输出CR+LF,其他部分 - 仅LF。很难分辨出哪一个来自单一输出。将它们分开并亲自看看。

  

提示符应显示" sw0:FID128:root>"但它表明   " SW0:FID128:根"

可能的原因:

  1. 你并没有忠实地捕捉输出。例如。某些内容也会打印到stderr
    • 使用2>&1或等效或以其他方式看到两个输出
  2. 重定向时,输出实际上与控制台上显示的不同。有些程序使用isatty()函数来区分它们。理由通常是更好地适应人类或机器阅读的输出。许多这样的程序都有明确指定输出风格的开关。
    • 您可以使用| cat(用于输出重定向)或cat <command_file> |(用于输入重定向)来检查是否是这种情况
  3. 使用telnet,它可以是。 >是一个命令提示符。它通常打印到stderr。它可以在那里打印,或者在有重定向时根本不打印。

      

    如果实际输出有2个标签,则文件只显示1个标签。

    可能与2)相同。也许输出经历的东西也会进行标签转换。