p2
- Inlämningsdatum 31 mar 2021 av 23.59
- Poäng 1
- Lämnar in en filuppladdning
- Filtyper py, txt, md och pdf
Table of Contents
1 Förberedelser
1.1 ssh
Under kursen kan det vara så att vissa uppgifter, av olika oförutsedda anledningar, inte fungerar på din egen dator utan bara på skolans datorer. Det går att köra program på skolans datorer via terminal med programmet ssh
Öppna en terminal (hemma eller i datasalarna) och skriv in följande (byt ut KTHLOGIN mot ditt användarnamn)
> ssh KTHLOGIN@student-shell.sys.kth.se
Första gången du kör ssh mot en ny dator så kan det komma upp en fråga om du litar på ip-adressen Links to an external site. som student-shell.sys.kth.se har. Svara yes på denna fråga och fortsätt logga in med ditt kth-login.
Verifiera att du är på skolans dator med kommandot uname -n. Då borde du få en utskrift liknande denna
> uname -n share-02.csc.kth.se
Öppna ytterligare en terminal på din dator och positionera de båda terminalerna bredvid varandra
Logga in på student-shell även i denna terminal, om du vill kan du använda följande alternativa syntax för att logga in
> ssh -l KTHLOGIN student-shell.sys.kth.se
Skapa/öppna en fil i terminalen med editeringsprogrammet nano (se p1) genom att i terminalen skriva
> nano dumt.py
Det kommer att se ut ungefär så här:
Skriv in print("dumt") i nano och tryck på <enter>
Spara filen genom att trycka Ctrl och o (det är vad menas med ^O i nederkantens hjälptext)
Kör programmet i den andra terminalen genom att skriva
> python3 dumt.py
Lägg till en till utskrift (print-sats) i programmet, spara och kör. På det här sättet kan du arbeta på skolans dator hemifrån.
1.2 scp
Avsluta editeringsprgrammet nano genom att trycka ctrl x Avsluta därefter ssh-sessionen i denna terminal genom att i terminalen trycka ctrl d
Du bör, om du gjort enligt instruktionerna, ha två terminaler sida vid sida där den ena är inloggad på skolans serverdator. Skriv uname -n i bägge terminalerna för att verifiera.
> uname -n
Kopiera dumt.py till din lokala dator med kommandot scp genom att i den lokala terminalen skriva
> scp KTHLOGIN@student-shell.sys.kth.se:dumt.py .
Kör därefter programmet på din lokala dator i samma terminal.
Det går att kopiera från din lokala dator till skolans dator med scp. Ändra en av printsatserna lokalt på din dator med din favoriteditor. Spara filen och kopiera därefter med scp
> scp dumt.py KTHLOGIN@student-shell.sys.kth.se:
Prova därefter att köra programmet i terminalen som är inloggad på skolans server
1.3 Alternativ till scp
Det finns grafiska gränssnitt till scp så att man kan dra och släppa filer. På windows maskiner finns programmet WinSCP som man dessutom kan ställa in att automatiskt kopiera över en fil om den ändras lokalt. På det sättet kan man jobba med sin favoriteditor lokalt och köra filen i en terminal på skolans server. Till Mac OS X finns programmet Cyberduck som även kan jobba mot molntjänster som google cloud.
1.4 curl
I programmeringsuppgiften som följer ska du hämta en fil med vanliga lösenord. Det kan du göra med curl på följande vis:
> curl http://www.csc.kth.se/utbildning/kth/kurser/DD1321/19/p2_passwords.txt > p2_passwords.txt
I efterföljande labbar kan filerna man ska hämta vara väldigt stora och då är det bättre att ladda ner dem med curl
1.5 Testa pythonkod interaktivt
I den här labben kommer du att jobba bl.a. med strängmanipulering Links to an external site., [[https://docs.python.org/3/library/stdtypes.html#typesmapping Links to an external site.][dictionaries] och listor Links to an external site..
Du förväntas läsa dokumentation om olika pythonanrop på nätet men ibland är det tillfredställande att prova sig fram interaktivt hur python fungerar. Starta en pythontolk i terminalen genom att skriva python3 och prova följande satser
> python3 >>> s1 = "hej\n" >>> s2 = " då " >>> print(s1 + s2) hej då >>> print(s1.strip() + s2.strip()) hejdå >>> s = "sommarlov" >>> s[0] + s[1] + s[2] 'som' >>> s[6:] 'lov' >>> s[-3:] 'lov' >>> s[:-3] 'sommar' >>> v = [] >>> v.append( s[:-3] ) >>> v ['sommar'] >>> v.extend( ['vinter', 'höst'] ) >>> v ['sommar', 'vinter', 'höst'] >>> alfabeta = {'a':'A', 'b':'B'} >>> alfabeta['a'] 'A' >>> if 'a' in alfabeta: print("a finns i", alfabeta) ... else: print("a finns INTE i", alfabeta) ... a finns i {'b': 'B', 'a': 'A'}>>> s[0:2] + s[-1] + 'a' 'sova' >>> "{}et {} var speciellt".format(s, 2019) 'sommarlovet 2019 var speciellt' >>> exit()
avsluta genom att skriva exit() eller trycka ctrl d
2 Programmeringsuppgift
Du ska skriva ett program som försöker gissa lösenord. Syftet med labben är att lära sig loopar, villkor, strängmanipulering, filhantering och annat matnyttigt.
Programmet utgår från en lista med vanliga lösenord som, om du inte gjort det redan i förberedelseuppgifterna, kan hämtas här:
http://www.csc.kth.se/utbildning/kth/kurser/DD1321/19/p2_passwords.txt[p2_passwords.txt]]
Listan ska utökas med varianter på dessa lösenord med blandade stora och små bokstäver och siffror däremellan.
2.1 Stora och små bokstäver
Skriv en hjälpfunktion som tar en bokstav och returnerar stor bokstav (om det går, annars returneras parametern oförändrad). Python har inbyggda funktioner för detta men du ska använda en dictionary där du hårdkodar in alfabetets små och stora bokstäver (se förberedelseuppgiftens alfabeta).
2.2 Lista med en stor bokstav
Skriv en funktion som tar en sträng och returnerar en lista av ord där en av bokstäverna gjorts till stor bokstav. Funktionen ska använda den hjälpfunktion du skrev nyss.
v = storbokstav("admin") # returnerar ['Admin', 'aDmin', 'adMin', 'admIn', 'admiN']
2.3 Lista med två stora bokstäver
Skriv en funktion som tar en sträng och returnerar en lista av ord där alla kombinationspar av två bokstäver har gjorts till versal
v = tvåstora("admin") # returnerar ['ADmin', 'AdMin', 'AdmIn', 'AdmiN', 'aDMin', 'aDmIn', 'aDmiN', 'adMIn', 'adMiN', 'admIN']
2.4 Lista med en inskjuten siffra eller specialtecken
Skriv en funktion som givet en sträng skjuter in en siffra eller ett specialtecken ( + - * / ). De ska läggas in i början och slutet och mellan varje bokstav.
I exemplet nedan läggs bara '2', '3' och '+' in
v = skjutinspecial("och") # returnerar ['2och', '3och', '+och', 'o2ch', 'o3ch', 'o+ch', 'oc2h', 'oc3h', 'oc+h', 'och2', 'och3', 'och+']
2.5 Kombinera metoderna
Skriv en funktion som kombinerar dina funktioner. För varje nytt ord där t.ex. en siffra blivit inkjuten ska du returnera alla varianter med en respektive två stora bokstäver.
För ordet fyra ska man få följande kombinationer (med '2', '3' och '+') som specialtecken
fyra Fyra ,fYra ,fyRa ,fyrA , FYra ,FyRa ,FyrA ,fYRa ,fYrA ,fyRA , 2fyra 2Fyra ,2fYra ,2fyRa ,2fyrA , 2FYra ,2FyRa ,2FyrA ,2fYRa ,2fYrA ,2fyRA , 3fyra 3Fyra ,3fYra ,3fyRa ,3fyrA , 3FYra ,3FyRa ,3FyrA ,3fYRa ,3fYrA ,3fyRA , +fyra +Fyra ,+fYra ,+fyRa ,+fyrA , +FYra ,+FyRa ,+FyrA ,+fYRa ,+fYrA ,+fyRA , f2yra F2yra ,f2Yra ,f2yRa ,f2yrA , F2Yra ,F2yRa ,F2yrA ,f2YRa ,f2YrA ,f2yRA , f3yra F3yra ,f3Yra ,f3yRa ,f3yrA , F3Yra ,F3yRa ,F3yrA ,f3YRa ,f3YrA ,f3yRA , f+yra F+yra ,f+Yra ,f+yRa ,f+yrA , F+Yra ,F+yRa ,F+yrA ,f+YRa ,f+YrA ,f+yRA , fy2ra Fy2ra ,fY2ra ,fy2Ra ,fy2rA , FY2ra ,Fy2Ra ,Fy2rA ,fY2Ra ,fY2rA ,fy2RA , fy3ra Fy3ra ,fY3ra ,fy3Ra ,fy3rA , FY3ra ,Fy3Ra ,Fy3rA ,fY3Ra ,fY3rA ,fy3RA , fy+ra Fy+ra ,fY+ra ,fy+Ra ,fy+rA , FY+ra ,Fy+Ra ,Fy+rA ,fY+Ra ,fY+rA ,fy+RA , fyr2a Fyr2a ,fYr2a ,fyR2a ,fyr2A , FYr2a ,FyR2a ,Fyr2A ,fYR2a ,fYr2A ,fyR2A , fyr3a Fyr3a ,fYr3a ,fyR3a ,fyr3A , FYr3a ,FyR3a ,Fyr3A ,fYR3a ,fYr3A ,fyR3A , fyr+a Fyr+a ,fYr+a ,fyR+a ,fyr+A , FYr+a ,FyR+a ,Fyr+A ,fYR+a ,fYr+A ,fyR+A , fyra2 Fyra2 ,fYra2 ,fyRa2 ,fyrA2 , FYra2 ,FyRa2 ,FyrA2 ,fYRa2 ,fYrA2 ,fyRA2 , fyra3 Fyra3 ,fYra3 ,fyRa3 ,fyrA3 , FYra3 ,FyRa3 ,FyrA3 ,fYRa3 ,fYrA3 ,fyRA3 , fyra+ Fyra+ ,fYra+ ,fyRa+ ,fyrA+ , FYra+ ,FyRa+ ,FyrA+ ,fYRa+ ,fYrA+ ,fyRA+
Det är tillåtet att få dubletter i sin lista. Tips, för att undvika dubletter kan man, förutom att lägga in orden i listan, även lägga in orden i en dictionary och kontrollera mot den innan man ligger in ordet.
2.6 Komplexitetsundersökning
Gör mätningar för att se hur dels längden på ett ord, dels antal inkjutna specialtecken påverkar hur många ordkombinationer som genereras.
- Skriv ner antal ordkombinationer (längden på listan) du får för olika långa ord.
- Variera antal siffror/specialtecken som skjuts in i ett givet ord och räkna antal ordkombinationer
Vad drar du för slutsats av komplexiteten i respektive fall?
2.7 Lösenord på fil
Läs in lösenord att prova från fil (se funktionen get_file_content i labb p1). Eventuellt behöver du använda strip() för att ta bort radreturtecken som lästs in från filen.
För vart och ett av lösenorden, generera alla kombinationer och spara ner dem i en fil.
def save_file_content(filename, list_of_combinations): with open(filename, 'w') as f: for item in list_of_combinations: f.write("%s\n" % item)
Du kan jämföra den lista du får med denna lista på kursens server som innehåller de flesta kombinationerna.
2.8 Kommandoradsargument
Skriv ett nytt program som läser in filen med ordkombinationer som du genererat. Programmet ska ta ett kommandoradsargument och kontrollera om ordet finns i listan. Om ordet finns i listan ska programmet skriva ut att ordet är olämpligt som password, i annat fall ska programmet inte skriva ut något alls.
Du behöver importera paketet sys. Kommandoradsargument hamnar i listan sys.argv. Prova koden nedan och skriv ut sys.argv
import sys if len( sys.argv ) > 1: word_to_test = sys.argv[1] else: print("Usage: python3", argv[0]. "<ord>")
Vid redovisningen ska du kunna generera en ordkombinationsfil och testa den med kommandoradsprogrammet. Du ska kunna redogöra för den kod du skrivit. Om ni är två som jobbat tillsammans ska var och en kunna redogöra för hela koden. Du ska också redogöra för vad du kommit fram till angående komplexiteten.