PowerShell рдФрд░ рдкрд╛рдпрдерди рдХреЗ рд╕рд╛рде рд╡рд┐рдВрдбреЛрдЬ рд╕реЗрд╡рд╛рдУрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА

рдЫрд╡рд┐
рдкреГрд╖реНрдарднреВрдорд┐:
рдореИрдВ рдЦреБрдж рдЯреЛрд░рдВрдЯреЛ, рдХрдирд╛рдбрд╛ рдореЗрдВ рдПрдХ рдмреНрд░реЛрдХрд░реЗрдЬ рдХрдВрдкрдиреА рдХреЗ рддрдХрдиреАрдХреА рд╡рд┐рднрд╛рдЧ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВред рдХреИрд▓рдЧрд░реА рдореЗрдВ рд╣рдорд╛рд░рд╛ рдПрдХ рдФрд░ рдХрд╛рд░реНрдпрд╛рд▓рдп рднреА рд╣реИред рдХрд┐рд╕реА рддрд░рд╣, рдПрдХ рджреВрд░рд╕реНрде рдХрд╛рд░реНрдпрд╛рд▓рдп рдореЗрдВ рдПрдХрд▓ рдбреЛрдореЗрди рдирд┐рдпрдВрддреНрд░рдХ рдкрд░ рд╡рд┐рдВрдбреЛрдЬ рдЕрдкрдбреЗрдЯ рдХреА рдирд┐рдпреЛрдЬрд┐рдд рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рдмрд╛рдж, W32Time рд╕реЗрд╡рд╛, рдЬреЛ рдмрд╛рд╣рд░реА рд╕реНрд░реЛрдд рдХреЗ рд╕рд╛рде рд╕рдордп рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рд╢реБрд░реВ рдирд╣реАрдВ рд╣реБрдИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд▓рдЧрднрдЧ рдПрдХ рд╕рдкреНрддрд╛рд╣ рдХреЗ рднреАрддрд░, рд╕рд░реНрд╡рд░ рдкрд░ рд╕рдордп рд▓рдЧрднрдЧ 20 рд╕реЗрдХрдВрдб рдЦреЛ рдЧрдпрд╛ред рдЙрд╕ рд╕рдордп рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╕реНрдерд╛рди, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдирд┐рдпрдВрддреНрд░рдХ рд╕реЗ рд╕рдордп рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реБрдЖред рдмреЛрд▓реА рд▓рдЧрд╛рдиреЗ рдХреЗ рд╕рдордп рдореЗрдВ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рд╕реЗрдХрдВрдб рдореЗрдВ рдЕрдВрддрд░ рдмрд╣реБрдд рдХреБрдЫ рд╣рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдкрд╣рд▓реА рдмрд╛рд░ рдЕрдВрддрд░, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдорд╛рд░реЗ рджрд▓рд╛рд▓реЛрдВ рджреНрд╡рд╛рд░рд╛ рджреЗрдЦрд╛ рдЧрдпрд╛ рдерд╛ред рд╣рдорд╛рд░рд╛ рддрдХрдиреАрдХреА рд╕рд╣рд╛рдпрддрд╛ рд╡рд┐рднрд╛рдЧ, рдЬрд┐рд╕рдореЗрдВ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ 3 рд▓реЛрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рдерд╛ред рдХреБрдЫ рдХрд░рдирд╛ рдЬрд░реВрд░реА рдерд╛ред рд╕рдорд╛рдзрд╛рди рд╕рдореВрд╣ рдиреАрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдерд╛, рдЬрд┐рд╕рдиреЗ рд╕рднреА рдорд╢реАрдиреЛрдВ рдХреЛ рдПрдХ рдЖрдВрддрд░рд┐рдХ NTP рд╕рд░реНрд╡рд░ рдкрд░ рднреЗрдЬрд╛ рдЬрд╛ рд░рд╣рд╛ рдерд╛ рдЬреЛ CentOS рдЪрд▓ рд░рд╣рд╛ рдерд╛ред рдбреАрд╕реА рдмрд╛рд░рд╛рдХреБрдбрд╛ рдПрдЬреЗрдВрдЯ рдХреЗ рд╕рд╛рде рдЕрднреА рднреА рд╕рдорд╕реНрдпрд╛рдПрдВ рдереАрдВ, рдЬреЛ рдбреЛрдореЗрди рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рд╣рдорд╛рд░реЗ рд╡реЗрдм рдлрд╝рд┐рд▓реНрдЯрд░ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдФрд░ рдХрдИ рдмрд╛рд░ рдХреБрдЫ рд╕реЗрд╡рд╛рдПрдВ рд╣рдореЗрдВ рдЪрд┐рдВрддрд╛ рднреА рджреЗрддреА рд╣реИрдВред рдлрд┐рд░ рднреА, рд╣рдордиреЗ рдХреБрдЫ рд╕реЗрд╡рд╛рдУрдВ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЧреБрдорд░рд╛рд╣ рдХрд┐рдпрд╛ рдФрд░ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдХрдИ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ, рдЬреНрдпрд╛рджрд╛рддрд░ рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдореИрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдкрдЯрдХрдерд╛ рднрд╛рд╖рд╛ рд╕реАрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╕реНрдерд╛рдиреАрдп рд▓рд┐рдирдХреНрд╕ рдЧреБрд░реБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдкрд╛рдпрдерди рдореЗрдВ рдПрдХ рдкрдЯрдХрдерд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реЗрдЪреНрдЫрд╛ рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ред рдирддреАрдЬрддрди, рдпрд╣ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛ рдЬреЛ рд╕рднреА рд╕реЗрд╡рд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ, рд╡рд╛рдВрдЫрд┐рдд рд╕реЗрд╡рд╛рдУрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдЙрдирдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдФрд░ рд╕реНрдерд┐рддрд┐ рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдорд╢реАрди рдХреЗ рд▓рд┐рдП рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рдорд╛рдзрд╛рди:

Windows рд╕рд░реНрд╡рд░ рдореЗрдВ рд╕реЗ рдПрдХ рдкрд░, рдореИрдВрдиреЗ рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ PowerShell рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдИ:
echo "Servername" > C:\Software\Services\Servername.txt get-date >> C:\Software\Services\Servername.txt Get-Service -ComputerName Servername | Format-Table -Property status, name >> C:\Software\Services\Servername.txt 


рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП 10 рдРрд╕реЗ рдЯреБрдХрдбрд╝реЗ рдереЗ

рдирд┐рдореНрди рдмреИрдЪ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЯрд╛рд╕реНрдХ рд╢реЗрдбреНрдпреВрд▓рд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ (рдпрд╣ рдореБрдЭреЗ рд╕реАрдзреЗ PowerShell рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╕реЗ рдЖрд╕рд╛рди рд▓рдЧ рд░рд╣рд╛ рдерд╛):

 powershell.exe C:\Software\Services\cal01script.ps1 


рдЕрдм рд╣рд░ рджрд┐рди рдореБрдЭреЗ рдПрдХ рд╣реА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рднреА рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реВрдЪреА рдорд┐рд▓реА:

 Servername Friday, October 26, 2012 1:24:03 PM Status Name ------ ---- Stopped Acronis VSS Provider Running AcronisAgent Running AcronisFS Running AcronisPXE Running AcrSch2Svc Running ADWS Running AeLookupSvc Stopped ALG Stopped AppIDSvc Running Appinfo Running AppMgmt Stopped aspnet_state Stopped AudioEndpointBuilder Stopped AudioSrv Running Barracuda DC Agent Running BFE Stopped BITS Stopped Browser Running CertPropSvc Running WinRM Stopped wmiApSrv Stopped WPDBusEnum Running wuauserv Stopped wudfsvc 


рдЕрдм рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдмреЛрд░реНрдб рдкрд░ CentOS рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ рдорд╢реАрди рдкрд░, рдореИрдВрдиреЗ рдпрд╣ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦреА рд╣реИ:

 import sys import smtplib import string from sys import argv import os, time import optparse import glob # function message that defines the email we get about the status def message(subjectMessage,msg): SUBJECT = subjectMessage FROM = "address@domain.com" TO = 'address@domain.com' BODY = string.join(( "From: %s" % FROM, "To: %s" % TO, "Subject: %s" % SUBJECT , "", msg ), "\r\n") s = smtplib.SMTP('mail.domain.com') #s.set_debuglevel(True) s.sendmail(FROM, TO, BODY) s.quit() sys.exit(0) def processing(runningServicesFileName,desiredServicesFileName): try: desiredServicesFile=open(desiredServicesFileName,'r') except (IOError,NameError,TypeError): print "The list with the desired state of services either does not exist or the name has been typed incorrectly. Please check it again." sys.exit(0) try: runningServicesFile=open(runningServicesFileName,'r') except (IOError,NameError,TypeError): print "The dump with services either does not exist or the name has been typed incorrectly. Please check it again." sys.exit(0) #Defining variables readtxt = desiredServicesFile.readlines() desiredServices = [] nLines = 0 nRunning = 0 nDesiredServices = len(readtxt) faultyServices = [] missingServices = [] currentServices = [] serverName = '' dumpdate='' errorCount=0 # Trimming file in order to get a list of desired services. Just readlines did not work putting \n in the end of each line for line in readtxt: line = line.rstrip() desiredServices.append(line) # Finding the number of currently running services and those that failed to start for line in runningServicesFile: nLines+=1 # 1 is the line where I append the name of each server if nLines==1: serverName = line.rstrip() # 3 is the line in the dump that contains date if nLines==3: dumpdate=line.rstrip() # 7 is the first line that contains valueable date. It is just the way we get these dumps from Microsoft servers. if nLines<7: continue # The last line in these dumps seems to have a blank character that we have to ignore while iterating. if len(line)<3: break line = line.rstrip(); serviceStatusPair = line.split(None,1) currentServices.append(serviceStatusPair[1]) if serviceStatusPair[1] in desiredServices and serviceStatusPair[0] == 'Running': nRunning+=1 if serviceStatusPair[1] in desiredServices and serviceStatusPair[0] != 'Running': faultyServices.append(serviceStatusPair[1]) if nLines==0: statusText='Dumps are empty on %s' % (serverName) detailsText='Dumps are empty' # Checking if there are any missing services for i in range(nDesiredServices): if desiredServices[i] not in currentServices: missingServices.append(desiredServices[i]) # Sending the email with results if nRunning == nDesiredServices: statusText='%s: OK' % (serverName) detailsText='%s: OK\nEverything works correctly\nLast dump of running services was taken at:\n%s\nThe list of desired services:\n%s\n' % (serverName,dumpdate,'\n'.join(desiredServices)) else: statusText='%s: Errors' % (serverName) detailsText='%s: Errors\n%s out of %s services are running.\nServices failed to start:%s\nMissing services:%s\nLast dump of the running services was taken at:\n%s\n' % (serverName,nRunning,nDesiredServices,faultyServices,missingServices,dumpdate) errorCount=errorCount+1 return (statusText,detailsText,errorCount) # Defining switches that can be passed to the script usage = "type -h or --help for help" parser = optparse.OptionParser(usage,add_help_option=False) parser.add_option("-h","--help",action="store_true", dest="help",default=False, help="this is help") parser.add_option("-d","--desired",action="store", dest="desiredServicesFileName", help="list of desired services") parser.add_option("-r","--running",action="store", dest="runningServicesFileName", help="dump of currently running services") parser.add_option("-c","--config",action="store", dest="configServicesDirectoryName", help="directory with desired services lists") (opts, args) = parser.parse_args() # Outputting a help message and exiting in case -h switch was passed if opts.help: print """ This script checks all services on selected Windows machines and sends out a report. checkServices.py [argument 1] [/argument 2] [/argument 3] Arguments: Description: -c, --config - specifies the location of the directory with desired list of services and finds dumps automatically -d, --desired - specifies the location of the file with the desired list of services. -r, --running - specifies the location of the file with a dump of running services. """ sys.exit(0) statusMessage = [] detailsMessage = [] body = [] errorCheck=0 directory='%s/*' % opts.configServicesDirectoryName if opts.configServicesDirectoryName: check=glob.glob(directory) check.sort() if len(check)==0: message('Server status check:Error','The directory has not been found. Please check its location and spelling.') sys.exit(0) for i in check: desiredServicesFileName=i runningServicesFileName=i.replace('desiredServices', 'runningServices') #print runningServicesFileName status,details,errors=processing(runningServicesFileName,desiredServicesFileName) errorCheck=errorCheck+errors statusMessage.append(status) detailsMessage.append(details) body='%s\n\n%s' % ('\n'.join(statusMessage),'\n'.join(detailsMessage)) if errorCheck==0: message('Server status check:OK',body) else: message('Server status check:Errors',body) if opts.desiredServicesFileName or opts.desiredServicesFileName: status,details,errors=processing(opts.runningServicesFileName,opts.desiredServicesFileName) message(status,details) 


рд╡рд╛рдВрдЫрд┐рдд рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдбрдВрдк рдФрд░ рд╕реВрдЪреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдПрдХ рд╣реА рдирд╛рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдЬрд┐рди рд╕реЗрд╡рд╛рдУрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЙрдирдХреА рд╕реВрдЪреА (рд╡рд╛рдВрдЫрд┐рдд) рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдиреА рдЪрд╛рд╣рд┐рдП:

 Acronis VSS Provider AcronisAgent AcronisFS AcrSch2Svc 


рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗрд╡рд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧреА, рдФрд░ рдлрд┐рд░ рдПрдХ рдИрдореЗрд▓ рд╕рдВрджреЗрд╢ рдореЗрдВ рдпрд╣ рд╕рдм рд▓рд┐рдЦреЗрдВрдЧреА, рдЬреЛ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд╣реЗрдЧреА рдХрд┐ рд╕рдВрджреЗрд╢ рд╡рд┐рд╖рдп рдореЗрдВ рд╕рдм рдХреБрдЫ рдХреНрд░рдо рдореЗрдВ рд╣реИ рдпрд╛ рдХрд┐ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ, рдФрд░ рд╕рдВрджреЗрд╢ рдореЗрдВ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВред рд╣рдорд╛рд░реЗ рд▓рд┐рдП, рджрд┐рди рдореЗрдВ рдПрдХ рдЪреЗрдХ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реБрдмрд╣ рдЬрд▓реНрджреА рдЙрдардХрд░ рд╣рдо рдЕрдкрдиреЗ рд╡рд┐рдВрдбреЛрдЬ рд╕рд░реНрд╡рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕реВрдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рд╡рд┐рдВрдбреЛрдЬ рдорд╢реАрди рд╕реЗ рд▓рд┐рдирдХреНрд╕ рдорд╢реАрди рдореЗрдВ рдлрд╛рдЗрд▓ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рд╕рд╣рдпреЛрдЧреА рдиреЗ рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмреИрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдорджрдж рдХреА:

 #!/bin/bash mkdir runningServices smbclient --user="user%password" "//ServerName.domain.com/software" -c "lcd runningServices; prompt; cd services; mget *.txt" cd runningServices for X in `ls *.txt`; do iconv -f utf16 -t ascii $X > $X.asc mv $X.asc $X done 


рдпрд╣ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЛ рднреА рдмрджрд▓ рджреЗрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реА рдорд╢реАрди рдкрд░ рд▓рд┐рдирдХреНрд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ UTF16 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдбрдВрдк рд╕реЗ рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдкреЙрд╡рд░рд╢реЗрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рд╕реНрдХ рд╢реЗрдбреНрдпреВрд▓рд░ рдореЗрдВ рдПрдХ рдмреИрдЪ рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реА рдЬреЛ рдбрдВрдк рдХреЛ рдорд┐рдЯрд╛ рджреЗрддреА рд╣реИред
рд╢рд░реАрд░ рдХреА рд╢рд░реНрдЯ:
 powershell.exe C:\Software\Services\delete.ps1 


рдкрд╛рд╡рд╢реЗрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ:
 remove-item C:\Software\Services\ServerName.txt 


рдкрд░рд┐рдпреЛрдЬрдирд╛ рдиреЗ 2 рд▓рдХреНрд╖реНрдпреЛрдВ рдХрд╛ рдкреАрдЫрд╛ рдХрд┐рдпрд╛ - рдирд┐рдЧрд░рд╛рдиреА рд╕реЗрд╡рд╛рдУрдВ рдФрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдкрд╛рдпрдердиред рдпрд╣ рд╣реИрдмреЗ рдкрд░ рдореЗрд░реА рдкрд╣рд▓реА рдкреЛрд╕реНрдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкрдиреЗ рд╕рдВрдмреЛрдзрди рдореЗрдВ рдЖрд▓реЛрдЪрдирд╛ рдХреА рдЖрдордж рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдЯрд┐рдкреНрдкрдгреА рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдкрд░, рддреЛ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ, рд╕рд╛рдЭрд╛ рдХрд░реЗрдВред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдРрд╕рд╛ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдореБрдлреНрдд рдореЗрдВ рдФрд░ рдИрдореЗрд▓ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдорд┐рд▓рд╛ред рд╢рд╛рдпрдж рд╡реЛ рдмреБрд░реА рддрд░рд╣ рд╕реЗ рджрд┐рдЦ рд░рд╣реА рдереАред

Source: https://habr.com/ru/post/In156597/


All Articles