Почему не выполняется работа горутин? Прочитав теорию работы горутин, в принципе ничего сложно, решаю практическую задачу для их понимания, но столкнулся с проблемой, хотелось бы получить консультацию на живом примере , нежели в выводе "Hello wordl!" горутинами в цикле.package main
import (
"bufio"
"bytes"
"fmt"
"golang.org/x/crypto/bcrypt"
"io"
"os"
"strings"
"sync"
)
var (
hash_target = "$2y$10$Jk2gOsrCgYKaVutj9JIVYuXlinrpzeqxdXng/Nm96O7t5AvVBir/a"
dict = "/home/supreme/rockyou.txt"
r io.Reader
err error
)
func main(){
r, err := os.Open(dict)
if err != nil{
fmt.Println(err)
}
defer r.Close()
var wg sync.WaitGroup
var reader *bufio.Reader = bufio.NewReader(r)
var pasw string
wg.Add(1)
for {
pasw, err = reader.ReadString('\n')
if err == io.EOF {
fmt.Printf("File %s end detected", dict)
} else {
pasw = strings.Replace(pasw, "\n", "", -1)
go hack_pass(pasw, hash_target, &wg)
}
}
wg.Wait()
}
func hack_pass(str string,hash_target string, wg *sync.WaitGroup){
fmt.Println("----------------------------------")
if CheckPasswordHash(str,hash_target){
fmt.Println("----------------------------------")
fmt.Println("[SUCCESS]:", str)
fmt.Println("----------------------------------")
os.Exit(0)
}else{
fmt.Println("[FAILURE]:", str)
}
wg.Done()
return
}
func CheckPasswordHash(password string, hash string)bool{
err := bcrypt.CompareHashAndPassword([]byte(hash),[]byte(password))
return err == nil
}

21 Авг 2019 в 07:11
228 +1
0
Ответы
1

Произошла ошибка в вашем коде из-за неправильного использования переменной r. Вы объявили переменную r снова в функции main, что приводит к созданию локальной переменной с тем же именем, но в другой области видимости, и это приводит к тому, что вы не используете глобальную переменную r, которая должна быть прочитана в основной программе.

Чтобы исправить это, вам нужно удалить объявление переменной r в функции main, чтобы использовать глобальную переменную r, которая была создана на уровне пакета. Вот исправленный код:

package main
import (
"bufio"
"fmt"
"golang.org/x/crypto/bcrypt"
"io"
"os"
"strings"
"sync"
)
var (
hash_target = "$2y$10$Jk2gOsrCgYKaVutj9JIVYuXlinrpzeqxdXng/Nm96O7t5AvVBir/a"
dict = "/home/supreme/rockyou.txt"
r io.Reader
err error
)
func main() {
r, err = os.Open(dict)
if err != nil {
fmt.Println(err)
}
defer r.(io.ReadCloser).Close()
var wg sync.WaitGroup
var reader *bufio.Reader = bufio.NewReader(r)
var pasw string
wg.Add(1)
for {
pasw, err = reader.ReadString('\n')
if err == io.EOF {
fmt.Printf("File %s end detected", dict)
break
} else {
pasw = strings.Replace(pasw, "\n", "", -1)
go hack_pass(pasw, hash_target, &wg)
}
}
wg.Wait()
}
func hack_pass(str string, hash_target string, wg *sync.WaitGroup) {
fmt.Println("----------------------------------")
if CheckPasswordHash(str, hash_target) {
fmt.Println("----------------------------------")
fmt.Println("[SUCCESS]:", str)
fmt.Println("----------------------------------")
os.Exit(0)
} else {
fmt.Println("[FAILURE]:", str)
}
wg.Done()
}
func CheckPasswordHash(password string, hash string) bool {
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
return err == nil
}

Теперь код должен работать правильно и перебирать пароли из файла "rockyou.txt", пытаясь взломать хэш. Надеюсь, это поможет вам исправить проблему с выполнением работы горутин. Если у вас возникнут другие вопросы, не стесняйтесь обращаться!

20 Апр 2024 в 13:06
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир