Знам, че е малко извън въпроса, но това е най-затворената тема, която намерих (бих искал да намеря този код преди седмица в тази публикация)
Търсих код за масова проверка дали дадена парола е активна и да я променя, ако е възможно
Putty има няколко cli инструмента като plink и pscp, които са полезни за много неща.
Ето функцията на python 3 за свързване към ssh сървър и приемане на ssh ключ. използването на pscp позволява автоматично приемане на ключ... може да бъде полезно за първи път
def TestSSHConnection(IP_Addr,User,Password,verbosity=0, force_plink=False):
#Some infos about returned code
# 0 = Error Or crash
# 1 = Connection ok
# 2 = No connect Password Error
# 3 = SSH key trouble (shit append)
# 4 = Timeout
# 5 = Host Unreachable
# 6 = Connection Crash
out=""
err=""
try:
if force_plink:
print("echo y | plink -l "+str(User)+" -pw "+str(Password)+" -batch "+str(IP_Addr)+" exit",)
ssh=subprocess.Popen("echo y | plink -l "+str(User)+" -pw "+str(Password)+" -batch "+str(IP_Addr)+" exit",shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE,encoding='utf8')#,stdin=subprocess.PIPE)
else:
print("echo y | pscp -l "+str(User)+" -pw "+str(Password)+" -ls "+str(IP_Addr)+":/",)
ssh=subprocess.Popen("echo y | pscp -l "+str(User)+" -pw "+str(Password)+" -ls "+str(IP_Addr)+":/",shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out,err = ssh.communicate()
try:
out = out.decode('utf-8')
except AttributeError as inst:
pass
except Exception as inst:
if verbosity>1:
print("While decoding stdout: "+str(type(inst)))
try:
err = err.decode('utf-8')
except AttributeError as inst:
pass
except Exception as inst:
print("While decoding stderr: "+str(type(inst)))
ssh.kill()
del ssh
except Exception as inst:
print("Crash"+str(inst))
return 0
if len(err)>0:
if 'Unable to open connection' in err or 'Host does not exist' in err:
if verbosity>0: print("Unreachable")
result = 5
if verbosity>1:
print()
print("-"*30)
print(err)
print("-"*30)
elif 'Connection timed out' in err:
result = 4
elif 'The server\'s host key is not cached in the registry' in err:
result = 3
if verbosity>1:
print()
print("SSH key Err".center(30,"-"))
print(err)
print("-"*30)
elif 'Access denied' in err:
result = 2
if verbosity>2:
print()
print("Denied".center(30,"-"))
print(err)
print("-"*30)
else:
result = 6
if verbosity>0: print("ConnCrash")
print("Oups".center(30,"-"))
print(err)
print("-"*30)
else:
if verbosity>0: print("Conn ok")
result = 1
del out,err
return result
Разбира се, това просто Проверете връзката (и приемете ssh ключ)
И така, ето код за стартиране на скрипт на хоста (точно промяна на парола). За да направите това, не можете да използвате синтаксис на един ред (дори трябва да работи, няма да стане, опитах) Трябва да преминете през скрипт файл и да го натиснете с plink.
def ChangeMyPassword(IP_Addr,User,Old_Password,New_Password,verbosity=0):
#Some infos about returned code
# 0 = Error Or crash
# 1 = Change Ok
# 2 = Old Password Error
# 3 = SSH key trouble (shit append)
# 4 = Timeout
# 5 = Host Unreachable
# 6 = Connection Crash
out=""
err=""
try:
path_script = "."+os.sep+"Script_chmdp_"+str(IP_Addr)+".sh"
if os.path.exists(path_script):os.remove(path_script)
fic_script = codecs.open(path_script,'w', encoding='utf8')
fic_script.write('echo -e \"'+str(Old_Password)+'\\n'+str(New_Password)+'\\n'+str(New_Password)+'\" | passwd')
fic_script.flush()
fic_script.close()
cmd = "plink -l "+str(User)+" -pw "+str(Old_Password)+" -batch "+str(IP_Addr)+ " "
cmd += "-m "+path_script
print(str(cmd))
ssh=subprocess.Popen(cmd,shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE,encoding='utf8')#,stdin=subprocess.PIPE)
out,err = ssh.communicate()
try:
out = out.decode('utf-8')
except AttributeError as inst:
pass
except Exception as inst:
if verbosity>1:
print("While decoding stdout: "+str(type(inst)))
try:
err = err.decode('utf-8')
except AttributeError as inst:
pass
except Exception as inst:
print("While decoding stderr: "+str(type(inst)))
ssh.kill()
del ssh
except Exception as inst:
print("Crash"+str(inst))
return 0
if 'all authentication tokens updated successfully' in out:
if verbosity>0: print("Conn ok")
result = 1
else:
if verbosity>0: print("Something goes wrong, hope we do not crash your server :)")
result = 0
del out,err
return result
Така че сега имате две функции за масова промяна на паролата на вашите системи.
Бонус: функция за получаване на /etc/passwd и /etc/shadow. Защо? за образователна употреба на вашия ИТ администратор като „хей, прецакате се и използвайте една и съща парола навсякъде и сега целият този акаунт може да бъде грубо форсиран. Така че почистете бъркотията си
def GetPass(IP_Addr,User,Password,verbosity=0, force_plink=False):
#Some infos about returned code
# 0 = Error Or crash
# 1 = Connection ok
# 2 = No connect Password Error
# 3 = SSH key trouble (shit append)
# 4 = Timeout
# 5 = Host Unreachable
# 6 = Connection Crash
out=""
err=""
try:
ssh=subprocess.Popen("echo "+str(Password)+" | plink -l "+str(User)+" -pw "+str(Password)+" -batch "+str(IP_Addr)+" sudo cat /etc/passwd;sudo cat /etc/shadow",shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE,encoding='utf8')#,stdin=subprocess.PIPE)
out,err = ssh.communicate()
try:
out = out.decode('utf-8')
except AttributeError as inst:
pass
except Exception as inst:
if verbosity>1:
print("While decoding stdout: "+str(type(inst)))
try:
err = err.decode('utf-8')
except AttributeError as inst:
pass
except Exception as inst:
print("While decoding stderr: "+str(type(inst)))
ssh.kill()
del ssh
except Exception as inst:
print("Crash"+str(inst))
return 0
if len(err)>0:
if 'Unable to open connection' in err or 'Host does not exist' in err:
if verbosity>0: print("Unreachable")
result = 5
if verbosity>1:
print()
print("-"*30)
print(err)
print("-"*30)
elif 'Connection timed out' in err:
result = 4
elif 'The server\'s host key is not cached in the registry' in err:
result = 3
if verbosity>1:
print()
print("SSH key Err".center(30,"-"))
print(err)
print("-"*30)
elif 'Access denied' in err:
result = 2
if verbosity>2:
print()
print("Denied".center(30,"-"))
print(err)
print("-"*30)
else:
result = 6
if verbosity>0: print("ConnCrash")
print("Oups".center(30,"-"))
print(err)
print("-"*30)
else:
if verbosity>0: print("Conn ok")
result = out
del out,err
return result
Още бележки:
ако не използвате shell=True, не получавате изхода и той не работи, не знам защо.
Опитах и асинхронна комуникация, за да изпращам команда ред по ред, не работи.
Опитах също командата ssh (да, вече съществува в windows \o/), но тя не работи за моята цел.
Надявам се това да помогне на някой един ден, на мен щеше да ми помогне много преди седмица :)
person
Physaphae
schedule
23.03.2020