在下面的代码中,我使用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()
答案 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命令列表中看到此命令 什么'找到'对应?