Почему объединение этих двух строк сдвигает последние 3 символа над передними 3 символами объединенной строки в Go? - PullRequest
0 голосов
/ 30 апреля 2019

При попытке объединить две строки они объединяются, но следующие три символа перезаписывают ранее объединенный текст, прежде чем снова продолжить объединение, как и ожидалось. Я подозреваю, что это как-то связано с функцией retrieve_mapped_value(cmd.Interaction.Replies[p_index].Variable[r_index], var_swap), так как этот феномен только происходит, когда он вызывается в двойном for разделе cmd.Interaction build_executable.

Где ошибка

func build_executable(cmd shell_command, var_swap string_matrix, is_first bool) string{
    sleep_duration := cmd.Sleep
    result := ""
    if !is_first{
        result = "send \""
    } else {
        result = "spawn "
    }
    result += cmd.Command
    if len(cmd.Options.Dashes) > 0 {
        for index := range cmd.Options.Dashes{
            if cmd.Options.Dashes[index] != "" || cmd.Options.Flags[index] != ""{
                result += " " + cmd.Options.Dashes[index] + cmd.Options.Flags[index]
            }
            if cmd.Options.Values[index] != ""{
                result += " " + cmd.Options.Values[index]
            }
        }
    }
    if len(cmd.Targets.Litteral) > 0{
        result += " "
        for index := range cmd.Targets.Litteral{
            result += cmd.Targets.Litteral[index] + retrieve_mapped_value(cmd.Targets.Variable[index], var_swap)
        }
    }
    if !is_first{
        result += "\\r\"\n"
    } else {
        result += "\n"
    }
    result += "sleep " + sleep_duration + "\n"
    if len(cmd.Interaction.Prompts) > 0{
        for p_index := range cmd.Interaction.Prompts{
            fmt.Println("cmd.Interaction.Prompts[p_index]\t" + cmd.Interaction.Prompts[p_index])
            result += "expect \"" + cmd.Interaction.Prompts[p_index] + "\"\nsend \""
            for r_index := range cmd.Interaction.Replies[p_index].Litteral{
                fmt.Println("cmd.Interaction.Replies[p_index].Litteral[r_index]\t'" + cmd.Interaction.Replies[p_index].Litteral[r_index] + "'")
                fmt.Println("cmd.Interaction.Replies[p_index].Variable[r_index]\t'" + cmd.Interaction.Replies[p_index].Variable[r_index] + "'")
                fmt.Println("retrieve_mapped_value(cmd.Interaction.Replies[p_index].Variable[r_index], var_swap)\t'" + retrieve_mapped_value(cmd.Interaction.Replies[p_index].Variable[r_index], var_swap) + "'")
                result += cmd.Interaction.Replies[p_index].Litteral[r_index] 
                result += retrieve_mapped_value(cmd.Interaction.Replies[p_index].Variable[r_index], var_swap)
                result += "" + "" + ""
            }
            result += "\\r\"\nsleep " + sleep_duration + "\n"
        }
    }
    if cmd.Expects != "" {
        result += "expect \"" + cmd.Expects + "\"\n"
    }
    return result
}

Подозреваемая функция

func retrieve_mapped_value(key string, mapping string_matrix) string{
    if key != "" {
        for _, layer := range mapping{
            if layer[0] == key {
                return layer[1]
            }
        }
    } else {
        return key
    }
    return "***No Match Error***"
}

Что я должен получить

expect "Enter password for user root: "
send "e3H-*HGHu__7\r"
sleep 10

Что я на самом деле получаю

expect "Enter password for user root: "
\r"d "e3H-*HGHu__7
sleep 10

Он берет последние 3 символа одной строки и перезаписывает ими переднюю часть. Я не понимаю.

1 Ответ

0 голосов
/ 04 мая 2019

Я так и не нашел решения, но секция temp_add ниже, где я произвольно отрезаю конец строки, работает.Здесь есть вуду.

func build_executable(cmd shell_command, var_swap string_matrix, is_first bool) string{
    sleep_duration := cmd.Sleep
    result := ""
    if !is_first{
        result = "send \""
    } else {
        result = "spawn "
    }
    result += cmd.Command
    if len(cmd.Options.Dashes) > 0 {
        for index := range cmd.Options.Dashes{
            if cmd.Options.Dashes[index] != "" || cmd.Options.Flags[index] != ""{
                result += " " + cmd.Options.Dashes[index] + cmd.Options.Flags[index]
            }
            if cmd.Options.Values[index] != ""{
                result += " " + cmd.Options.Values[index]
            }
        }
    }
    if len(cmd.Targets.Litteral) > 0{
        result += " "
        for index := range cmd.Targets.Litteral{
            result += cmd.Targets.Litteral[index] + retrieve_mapped_value(cmd.Targets.Variable[index], var_swap)
        }
    }
    if !is_first{
        result += "\\r\"\n"
    } else {
        result += "\n"
    }
    result += "sleep " + sleep_duration + "\n"
    if len(cmd.Interaction.Prompts) > 0{
        for p_index := range cmd.Interaction.Prompts{
            interaction_result := "expect \"" + cmd.Interaction.Prompts[p_index] + "\"\nsend \""
            temp_add := ""
            for r_index := range cmd.Interaction.Replies[p_index].Litteral{
                interaction_result += cmd.Interaction.Replies[p_index].Litteral[r_index]
                temp_add = retrieve_mapped_value(cmd.Interaction.Replies[p_index].Variable[r_index], var_swap)
                if temp_add != ""{      //this looks wasteful but it is needed for reasons I don't understand
                    temp_add += "\n"    //the basic explaination is it seems `retrieve_mapped_value` appends a carriage return & this
                    temp_add = temp_add[:len(temp_add) - 2]     //messes up the script, I don't know why it appends it, but removes it
                }
                interaction_result += temp_add
            }
            interaction_result += "\\r\"\nsleep " + sleep_duration + "\n"
            result += interaction_result
        }
    }
    if cmd.Expects != "" {
        result += "expect \"" + cmd.Expects + "\"\n"
    }
    return result
}
...