Go SMB2, каталог чтения и распечатки - PullRequest
1 голос
/ 16 апреля 2020

Я пытаюсь отобразить содержимое каталога на общем ресурсе от Linux до Windows, используя Go. Пока мне удалось создать / удалить новые файлы внутри общего ресурса с полными разрешениями на чтение / запись.

Go модуль: https://godoc.org/github.com/hirochachacha/go-smb2#Client

Функции:

func connect_client(host string, share string, session map[string]string) *smb2.Client {
    //Checks for a connection on port
    conn, err := net.Dial("tcp", host+":445")
    if err != nil {
        panic(err)
    }
    //smb auth
    d := &smb2.Dialer{
        Initiator: &smb2.NTLMInitiator{
            User:     session["Username"],
            Password: session["Password"],
            Domain:   session["Domain"],
        },
    }
    //Returns a client session
    client, err := d.Dial(conn)
    if err != nil {
        fmt.Println("Connection failed")
        client.Logoff()
    } else {
        fmt.Println("Connection Succeeded")
    }
    return client
}

func check_write(host string, client *smb2.Client) {
    file := "asdasdas.txt"
    fs, err := client.Mount(host)
    if err != nil {
        fmt.Println(err)
        os.Exit(0)
    }
    defer fs.Umount()
    share := strings.Split(host, `\\`)
    f, err := fs.Create(file)
    if err != nil {
        fmt.Println("You do not have write permissions on directory:%s ! \n", strings.Split(share[1], `\`)[1])
        os.Exit(0)

    }
    defer fs.Remove(file)
    defer f.Close()
    fmt.Printf("You have write permissions to directory: %s \n", strings.Split(share[1], `\`)[1]))

}

func list_all(client *smb2.Client, host string) {
    fs, err := client.Mount(host)
    if err != nil {
        fmt.Println(err)
        os.Exit(0)
    }
    defer fs.Umount()

    _, err = fs.Open(`Test.txt`)
    if err != nil {
        fmt.Println(err)
        os.Exit(0)
    }

}

func main() {
    host, share, action, session := get_flags()
    client := connect_client(host, share, session)
    full_host := `\\` + host + `\` + share

    //File create
    if action == "check_write" {
        check_write(full_host, client)
    }
    if action == "list_files" {
        list_all(client, full_host)
    }

}

В функции list_all () все работает, но когда я пытаюсь получить доступ \\ 192.168.1.19 \ Sharing only .. Когда я ввожу только хост с именем каталога, он может не отображаться путь к каталогу, потому что он не может найти указанный объект. Я не могу понять, как я могу использовать указатель для * RemoteFile, чтобы использовать функции:

f.Readdir ()

f.Name () et c ... .

До сих пор мне удавалось использовать * RemoteFileSystem только для всех других действий, но я хочу перечислить все содержимое каталога ..

Справка будет принята с благодарностью!

Редактировать: Если это не было достаточно ясно, чтобы использовать такие функции, как: f.Readdir () f.Name () Мне нужно получить указатель на * RemoteFile, это моя основная проблема

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020
func list_all(client *smb2.Client, host string) {

    fs, err := client.Mount(host)
    if err != nil {
        fmt.Println(err)
        os.Exit(0)
    }
    dir, err := fs.Open("")
    if err != nil {
        fmt.Println(err)
        os.Exit(0)
    }
    fis, err := dir.Readdir(-1)
    if err != nil {
        fmt.Println(err)
        os.Exit(0)
    }
    for i := range fis {
        fmt.Println(fis[i].Name())
    }
}

Это был бы ответ, спасибо!

0 голосов
/ 16 апреля 2020

https://godoc.org/github.com/hirochachacha/go-smb2#RemoteFileSystem .Open

Использовать Open в RemoteFileSystem и либо имя каталога, либо пустую строку для каталога в root файловой системы.

например

        client, err := d.Dial(conn)
        if err != nil {
                return err
        }
        rfs, err := client.Mount("jrwren")
        if err != nil {
                return err
        }
        // cat the NOTES file.
        f, err := rfs.Open("NOTES")
        if err != nil {
                return err
        }
        defer f.Close()
        io.Copy(os.Stdout, f)

        // List all the files
        dir, err := rfs.Open("")
        if err != nil {
                return err
        }
        fis, err := dir.Readdir(10)
        if err != nil {
                return err
        }
        for i := range fis {
                fmt.Println(fis[i].Name())
        }
...