როგორ მოვახდინოთ ავტომატიზაცია VPN-ის შესვლისა, რომელიც ტოკენის კოდს ელოდება
CLI VPN კლიენტი, რომელიც ტერმინალში ითხოვს შეყვანას, აჩერებს სკრიპტს, რომელიც მხოლოდ პაროლს გადასცემს მილით. შეასრულეთ ეს ხუთი შემოწმება, სანამ expect-ს მიმართავთ.
სკრიპტი, რომელიც მომწოდებლის VPN კლიენტს უშვებს, იკიდება ვადის ამოწურვამდე, და ჟურნალი აჩვენებს, რომ კლიენტი ითხოვს დადასტურების კოდს, რომელიც არავის შეუყვანია. პაროლი გადაცემული იყო, ამიტომ აშკარა დასკვნაა, რომ პაროლი არასწორია. ასე არ არის. კოდის მოთხოვნა ცალკე საუბარია ცალკე არხზე, და თქვენმა სკრიპტმა ის არასოდეს გახსნა.
გაიარეთ ქვემოთ მოცემული ხუთი შემოწმება თანმიმდევრობით. გაჩერდით პირველზე, რომელიც ვერ დაკმაყოფილდა, რადგან ყოველი შემდეგი ნაბიჯი წინების ძალაში ყოფნას გულისხმობს.
შემოწმება 1: კითხულობს კლიენტი საერთოდ სტანდარტულ შეყვანას?
სცადეთ სანამ რაიმე ავტომატიზაციას დაწერთ: მილით გაუგზავნეთ კლიენტს ყალბი საიდუმლო და ნახეთ რა მოხდება. თუ ის თავის მოთხოვნას ბეჭდავს და შემდეგ ელოდება, მილს არ კითხულობს.
ბევრი კლიენტი ტერმინალის მოწყობილობას პირდაპირ ხსნის, ან უარს ამბობს საიდუმლოს მიღებაზე არატერმინალური ნაკადიდან, რათა შემთხვევითმა მილმა პაროლი არ გაამჟღავნოს. OpenVPN დოკუმენტირებული გამონაკლისია, რადგან --auth-user-pass ფაილის ბილიკს იღებს. ერთჯერად კოდს მომთხოვნ მომწოდებლის კლიენტებს ჩვეულებრივ არ აქვთ ეკვივალენტური არჩევანი, და მათი მოთხოვნა ელოდება ტერმინალს, რომელიც თქვენმა სკრიპტმა არასოდეს მისცა.
შემოწმება 2: აქვს შვილ პროცესს ტერმინალი?
pty ანიჭებს ტერმინალს შვილს, რაც მოთხოვნებს კითხვად გამომავალ ტექსტად აქცევს, რომელზეც თანმიმდევრობით შეგიძლიათ პასუხი.
import pexpect
child = pexpect.spawn("openconnect vpn.example.net", encoding="utf-8", timeout=30)
child.expect("GROUP:")
child.sendline("staff")
child.expect("USERNAME:")
child.sendline("alice")
child.expect("PASSWORD:")
child.sendline(PASSWORD)
child.expect("Connected as", timeout=60)ზემოთ მოცემული მოთხოვნის სტრიქონები საილუსტრაციოა; დააკოპირეთ ზუსტი ტექსტი, რომელსაც თქვენი კლიენტი ბეჭდავს, ასოების ზომისა და პუნქტუაციის ჩათვლით. ყველა მოლოდინს აქვს ვადა, და დახურული შვილი სტატუსის დაბრუნების ნაცვლად გამონაკლისს ისვრის, ამიტომ შემოახვიეთ მიმდევრობა და ფაილის დასასრული ჩავარდნად ჩათვალეთ. ყურადღება მიაქციეთ, რას არ აკეთებს ეს ბლოკი: შვილი სკრიპტთან ერთად კვდება, რადგან pty გამოყოფის მექანიზმი არ არის და disown გარსის ჩაშენებული ბრძანებაა, რომელიც თქვენი სკრიპტის მიერ შექმნილ პროცესს ვერ აღწევს.
შემოწმება 3: არსებობს მხარდაჭერილი არაინტერაქტიული შეყვანა?
ეკრანის ფხეკა კლიენტის განახლებებზე ფუჭდება, ამიტომ ჯერ დოკუმენტირებული არჩევანი მოძებნეთ.
შეამოწმეთ დახმარების გამომავალი ტოკენის ან ერთჯერადი კოდის არჩევანზე, და შეამოწმეთ, იღებს თუ არა სერვისი პაროლის ველზე დამატებულ კოდს. სადაც კლიენტი რწმუნებათა ფაილს კითხულობს, მისცით მას ფაილი მოთხოვნის ნაცვლად:
openvpn --config office.ovpn --auth-user-pass <(printf "%s\n%s\n" "$USER_NAME" "$PASSWORD")პროცესის ჩანაცვლება კლიენტს კითხვად ბილიკს აძლევს სისტემებზე, რომლებიც /dev/fd-ს გვთავაზობენ. საიდუმლო კლიენტის თვალსაზრისით მაინც საიდუმლოა, ამიტომ დააშორეთ ის ჟურნალებს, გარსის ისტორიას და პროცესების სიებს. თუ კლიენტი /dev/fd-ს უარყოფს ან რწმუნებათა ბილიკს ერთზე მეტჯერ ხსნის, დაწერეთ ნამდვილი ფაილი მკაცრი უფლებებით და წაშალეთ იმავე სკრიპტში.
შემოწმება 4: გადააჭარბებს თუ არა გვირაბი სკრიპტს?
ნაგულისხმევად გვირაბი მშობელთან ერთად კვდება, რაც საწყისი სკრიპტის საჭიროების საპირისპიროა.
disown -h ეხმარება მხოლოდ მაშინ, როცა კლიენტი გარსის დავალებად გაუშვით, რადგან ის ამ გარსის დავალებათა ცხრილს არედაქტირებს და ვერ აღწევს პროცესს, რომელიც თქვენმა სკრიპტმა pty-ით შექმნა. სერვისის მმართველი უკეთესი სახლია ყველაფრისთვის, რაც ზედამხედველობის გარეშე უნდა ხელახლა დაუკავშირდეს, რადგან ის კლიენტს ხელახლა უშვებს და აღრიცხავს, რატომ მოკვდა. ყოველ შემთხვევაში, ყოველი ხელახალი დაკავშირების შემდეგ ახალ კოდს მოელოდეთ: ერთჯერადი ტოკენი პირველ წარმატებულ ავთენტიფიკაციაზე იხარჯება.
დააკვირდით, რას უკეთებს sudo მიმდევრობას. sudo-ს პაროლის მოთხოვნა VPN-ის მოთხოვნა არ არის, და მასზე VPN-ის პაროლით პასუხი ყველაზე გავრცელებული გზაა, რომლითაც სხვაგვარად სწორი მოლოდინების რიგი მაინც ვარდება.
შემოწმება 5: უნდა იყოს ადამიანის კოდი სკრიპტში?
ეს არის შემოწმება, რომელსაც ხალხი გამოტოვებს. ტოკენი ადამიანს ეკუთვნის, ხოლო გვირაბი, რომელიც გრაფიკით უნდა ამოვიდეს, მანქანას ეკუთვნის.
თუ სამუშაო ზედამხედველობის გარეშე ხელახლა უნდა დაუკავშირდეს, ჰკითხეთ, შეუძლია თუ არა მანქანის სერტიფიკატს ან სერვისის ანგარიშს ინტერაქტიული შესვლის ჩანაცვლება. ვიღაცის ერთჯერადი კოდის ავტომატიზაცია მეორე ფაქტორს შენახულ საიდუმლოდ აქცევს, რაც პოლიტიკის ცვლილებაა და არა სკრიპტის მოხერხებულობა. სადაც სერვისი ორივეს მხარს უჭერს, აირჩიეთ ის რწმუნება, რომელიც ერგება იმას, როგორ მუშაობს სამუშაო სინამდვილეში. ჩაწერეთ პასუხი, რადგან შემდეგი ადამიანი იკითხავს, რატომ უჭირავს სკრიპტს ტოკენი.
როგორ გამოიყურება მომუშავე სკრიპტი
სკრიპტი ბეჭდავს მიღწეულ საფეხურს, არასოდეს საიდუმლოს, და გამოდის არანულოვანი კოდით ყოველ ჩავარდნილ მოლოდინზე.
შეამოწმეთ ის განზრახ გატეხვით: არასწორი პაროლი, არასწორი ჯგუფი, ვადაგასული ტოკენი. ყოველი ჩავარდნა დასახელებულ საფეხურზე უნდა გაჩერდეს და არა ჩაიკიდოს. შემდეგ ერთხელ გაუშვით ის რეალური სერვისის წინააღმდეგ და შეამოწმეთ გვირაბი სკრიპტის გარედან, და არა შიგნიდან.