перезагрузите или создайте файл / etc / enviornment из кода golang - PullRequest
0 голосов
/ 09 мая 2020

Я пробовал исходную команду из моего go кода после записи переменных env в файл / etc / enviornment.

Ниже приведен пример кода.

package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "os"
    "os/exec"
    "strings"
)

func main() {
    address := "localhost:9090"
    file, err := os.OpenFile("/etc/environment", os.O_RDWR, 0644)
    defer file.Close()
    if err != nil {
        panic(err)
    }
    input, err := ioutil.ReadAll(file)
    if err != nil {
        log.Fatalln(err)
    }

    lines := strings.Split(string(input), "\n")

    for i, line := range lines {
        if strings.Contains(line, "HTTP_PROXY") {
            lines[i] = "HTTP_PROXY=" + address
        } else {
            if i == (len(lines) - 1) {
                lines[i] = "HTTP_PROXY=" + address
            }
        }
    }
    output := strings.Join(lines, "\n")
    err = ioutil.WriteFile("/etc/environment", []byte(output), 0644)
    if err != nil {
        log.Fatalln(err)
    }

    cmd := exec.Command("bash", "-c", "source /etc/environment")
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr
    err = cmd.Run()
    fmt.Println("cmd=================>", cmd, err)

    if err != nil {
        fmt.Println(err)
    }
}

Он не возвращает никаких ошибок

Но когда я пытаюсь проверить свой HTTP_PROXY при использовании env | grep -i proxy, я не вижу, чтобы это отражалось. Я вижу, что изменение сделано только после перезапуска системы или повторного запуска исходной команды с другого терминала.

Все, что я хочу, - это изменить прокси-сервер os с кода go без перезапуска системы.

Если есть какой-либо другой подход к этому, просьба также упомянуть об этом.

Ответы [ 2 ]

2 голосов
/ 09 мая 2020

Но когда я пытаюсь проверить свой HTTP_PROXY при использовании env | grep -i proxy Я не вижу, чтобы это отражалось.

Это потому, что среда перезагружается только в новом сеансе (или если вы выбрали его вручную). В противном случае переменные текущей оболочки остаются прежними.

cmd := exec.Command("bash", "-c", "source /etc/environment")

Команда запускается в подоболочке, и изменения в ней не влияют на родительскую оболочку . Таким образом, как только процесс завершается, изменения исчезают.

На самом деле, невозможно изменить переменные среды, которые могут повлиять на родительский процесс, поскольку изменения повлияют только на текущий / дочерний процессы - поэтому не могут изменить окружение родительского процесса.

1 голос
/ 09 мая 2020

Когда вы запускаете cmd := exec.Command("bash", "-c", "source /etc/environment"), это загружает переменные env, но ограничивается только сеансом, созданным командой 'bash', поэтому не будет влиять на другой сеанс.

Что вы можете сделать для каждого мои 2 цента:

  1. Измените приведенный выше код только для изменения файла
  2. Создайте простой bash скрипт для запуска вашего go файла или выполните скомпилированный файл, а затем получите / etc / env file

Bash файл может быть примерно таким

#! /bin/bash
go run your_change_envfile.go
source /etc/environment

Затем просто запустите файл bash, не забудьте нажать chmod + x на ваш bash, чтобы его можно было выполнить.

...