如何搜索我在下面返回的文件

时间:2011-08-22 18:45:46

标签: python paramiko

在下面的代码中,我使用Paramiko远程登录到嵌入式站点服务器并检索所有.log和.txt文件,并将它们放在我本地计算机上的文件夹中,以搜索可能存在的潜在引脚#清楚。在第二段代码中,这是一个脚本的一部分,可以解压缩.tgz文件并执行ascii,hex等字符串的搜索....我发现远程获取文件不符合成本效益,并认为它更好只需在登录时在嵌入式设备上搜索所有.log和.txt。但是,我仍然是一个Python新手,我花了很长时间来提出我现在使用的代码。我是为了时间而请求帮助。有人能告诉我如何使用下面的代码来实现更多的exec_commands(我已经有代码搜索 - 在第一个代码下面)?我只是不确定在哪里以及如何实现它。谢谢!

 import paramiko
 import sys
 import os
 import re



 sim_ip = raw_input('Host: ')
 pattern = r"\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"


 if re.match(pattern, sim_ip):

     ssh = paramiko.SSHClient()
     ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
     ssh.connect(sim_ip, username='root', password='******')
     apath = '/'
     apattern = '"*.txt" -o -name "*.log"' 
     rawcommand = 'find {path} -name "*.txt" -o -name "*.log"' #{pattern}
     command = rawcommand.format(path=apath, pattern=apattern)
     stdin, stdout, stderr = ssh.exec_command(command)
     filelist = stdout.read().splitlines()
     ftp = ssh.open_sftp() 
     for afile in filelist:
        (head, filename) = os.path.split(afile)
        print(filename)
        #ftp.get(afile, 'c:\\Extracted\\' + filename)  #'./'+filename)

     ftp.close()
     ssh.close()

 else:
    print "You entered an invalid IP Address!!!"

以下是我目前用于搜索日志和文本文件的代码:

 print "\nDirectory to be searched: " + directory
      print "\nFile result2.log will be created in: c:\Temp_log_files."
      paths = "c:\\Temp_log_files\\result2.log"
      temp = file(paths, "w")
      userstring = raw_input("Enter a string name to search: ")
      userStrHEX = userstring.encode('hex')
      userStrASCII = ''.join(str(ord(char)) for char in userstring)
      regex = re.compile(r"(%s|%s|%s)" % ( re.escape( userstring ), re.escape( userStrHEX ), re.escape( userStrASCII )))
      goby = raw_input("Press Enter to begin search (search ignores whitespace)!\n")


      for root,dirname, files in os.walk(directory):
          for file1 in files:
              if file1.endswith(".log") or file1.endswith(".txt"):
                 f=open(os.path.join(root, file1))
                 for i,line in enumerate(f.readlines()):
                     result = regex.search(line)
                     if result:
                         ln = str(i)
                         pathnm = os.path.join(root,file1)

                         template = "\nLine: {0}\nFile: {1}\nString Type: {2}\n\n"
                         output = template.format(ln, pathnm, result.group())
                         print output
                         temp.write(output)
                         break    
                 else:
                    print "String Not Found in: " + os.path.join(root,file1)
                    temp.write("\nString Not Found: " + os.path.join(root,file1) + "\n")



                 f.close()
      re.purge()

2 个答案:

答案 0 :(得分:0)

paramiko有内置的类,可以完全按照您在第一个代码部分中执行的操作。

apath = '/'
apattern = '"*.txt" -o -name "*.log"' 
rawcommand = 'find {path} -name "*.txt" -o -name "*.log"' #{pattern}
command = rawcommand.format(path=apath, pattern=apattern)
stdin, stdout, stderr = ssh.exec_command(command)
filelist = stdout.read().splitlines()
ftp = ssh.open_sftp() 
for afile in filelist:
    (head, filename) = os.path.split(afile)
    print(filename)
    #ftp.get(afile, 'c:\\Extracted\\' + filename)  #'./'+filename)

可归结为

ftp = ssh.open_sftp()

for files in ftp.listdir():
    if os.path.splitext(files) in ('.log','.txt'):
        print os.path.split(files)[1]

阅读他们的API文档:http://www.lag.net/paramiko/docs/

答案 1 :(得分:0)

根据我在this page中读到的内容,当需要执行多个命令时,每个命令必须在exec_command()上写在不同的行上。
但我不知道这是否有效:

command1 = ............
command2 = ..........
command3 = ...............
stdin, stdout, stderr = ssh.exec_command('\n'.join((command1,command2,command3)))

command1 = ............
command2 = ..........
command3 = ...............
allcomands = '''%s
%s
%s'''
stdin, stdout, stderr = ssh.exec_command(allcommands % (command1,command2,command3)))

由于你的问题,我刚刚发现Paramiko 我可以使用什么SSH2站点来运行您的代码?我没有SFTP或其他类型的帐户来执行真正的论文。

我对你在命令的定义中写'找'这一事实感到困惑 我没有在SSH2和SFTP命令列表中看到此命令 什么'找到'对应?