Gehen Sie für Systemadministratoren. Praxisbeispiele. Teil 0

Hallo, mein Name ist Vitaliy und ich bin ein AffePraktiker - für mich ist es besser, einmal zu sehen und zu kopieren, als hundertmal abstrakte Handbücher zu lesen. Ich war lange Zeit ein regulärer Systemadministrator - ich schrieb Skripte auf CMD / BAT und sogar auf sh (mit busybox für Windows). Aber als ich anfing, die übliche Shell zu vermissen, entschloss ich mich, einen eigenen RPC-Server zu schreiben, der mit einem Minimum an Systemkomponenten funktionierte, verständlich war, mehrere Threads umfasste und ein Minimum an Codezeilen enthielt. Ich habe Java und andere OOPs geschlossen, da sie für Profis zu abstrakt sind und ich die Umgebung für die Ausführung auf den Zielcomputer stellen muss. Als Administrator aktualisiere ich sie. Ich habe lange nach Perl geschaut, aber ich habe Angst vor dynamischem Tippen. In dem Artikel werde ich Ihnen erklären, wie Sie mit einer Person, die neu in der Programmierung ist, einige Probleme der Systemadministration lösen können! Go .

Ich gehe davon aus, dass Sie "Quick Start - Go Programmable under Windows - Setting Environment" beherrschen und Erfahrung mit dem Schreiben einfacher Skripte haben. Und ich habe gelogen. Der Zielcomputer erfordert möglicherweise Microsoft Visual C ++ .

Zunächst versuchen wir, ein einfaches Skript in eine Go-App zu verwandeln. Nehmen Sie zum Beispiel test.bat :

@echo off
set URL1="ftp://user:pass@88.88.88.88/test.zip"
set URL2="ftp://user1:pass1@99.99.99.99/exchange/test.zip"
set SAVE_PATH=".\test\test.zip"
echo Первый источник
curl %URL1% -o %SAVE_PATH%
if %errorlevel% NEQ 0 (
echo  Загрузка из первого источника закончилась с ошибкой: %errorlevel%
curl %URL2% -o %SAVE_PATH%
)

Ein Moment der Liebe zu Microsoft. Wenn ich überprüfen möchte, ob die Datei von der zweiten Quelle heruntergeladen wurde, muss ich GOTO verwenden , da in IF und FOR % errorlevel% und % time% dieselben Werte wie vor dem Aufrufen von IF und FOR verwendet werden .

Unser Go-Skript sieht ungefähr so ​​aus:

package main
import (
	"fmt"
	"os"
	"os/exec"
)
func main() {
	url1 := "ftp://user:pass@88.88.88.88/test.zip"
	url2 := "ftp://user1:pass1@99.99.99.99/exchange/test.zip"
	out_file := ".\\test\\test.zip"     //В Go бэкслэш используется для экранирования, так что в пути windows его придется удваивать.
	err := start_curl(url1, out_file)
	if err != nil {
		fmt.Printf("Загрузка из первого источника закончилась с ошибкой: %v\r\n", err)
		err = start_curl(url2, out_file)
		if err != nil {
			fmt.Printf("Загрузка из второго источника закончилась с ошибкой: %v\r\n", err)
			os.Exit(1)
		}
	}
	fmt.Printf("Загрузка успешно завершена\r\n")
}
func start_curl(url string, out_file string) error {
	cmd := exec.Command("curl", url, "-o", out_file)
	err := cmd.Run()
	return err
}

Wir haben mit dem Start begonnen, aber zum Debuggen wäre es schön zu sehen, was Curl in stderr / stdout erzeugt. Übrigens zeigt curl alles in stderr an:

func start_curl(url string, out_file string) error {
	cmd := exec.Command("curl", url, "-o", out_file)
	//cmd.Stdout = os.Stdout     //Закомментировать строку можно можно двумя слэшами.
	cmd.Stderr = os.Stderr
	err := cmd.Run()
	return err
}

Im Fehlerfall gibt die Funktion start_curl () so etwas wie "Exit-Code 7" zurück. Und wir möchten einen Rückgabecode in Form einer Nummer erhalten. Wir können die Zeichenfolge "exit_code" abschneiden und die Zeichenfolge "7" in "number7" konvertieren. Dazu müssen Sie die Pakete strings und strconv importieren. Aber es gibt einen einfacheren und weniger klaren Weg:

package main
import (
	"fmt"
	"os"
	"os/exec"
	"syscall"
)
func main() {
	url1 := "ftp://user:pass@88.88.88.88/test.zip"
	url2 := "ftp://user1:pass1@99.99.99.99/exchange/test.zip"
	out_file := ".\\test\\test.zip"
	int_err := start_curl(url1, out_file)
	if int_err != 0 {
		fmt.Printf("Загрузка из первого источника закончилась с ошибкой: %d\r\n", int_err)
		int_err = start_curl(url2, out_file)
		if int_err != 0 {
			fmt.Printf("Загрузка из второго источника закончилась с ошибкой: %d\r\n", int_err)
			os.Exit(int_err)
		}
	}
	fmt.Printf("Загрузка успешно завершена\r\n")
}
func start_curl(url string, out_file string) int {
	var exit_code int
	cmd := exec.Command("curl", url, "-o", out_file)
	//cmd.Stdout = os.Stdout
	//cmd.Stderr = os.Stderr
	err := cmd.Run()
	if err != nil {
		exit_code = int(err.(*exec.ExitError).Sys().(syscall.WaitStatus).ExitCode)
	} else {
		exit_code = 0
	}
	return exit_code
}

Das ist alles für heute. Der Compiler holt die fertige exe-Datei für uns ab. Angst vor einer großen Größe (mehrere Megabyte) ist nicht erforderlich. Die minimale Laufzeit und alle notwendigen Pakete werden in dieser Datei gesammelt. Der Speicherverbrauch der Go-App ist halb so hoch wie der von Perl oder Python (es sei denn, es handelt sich um kleine Anwendungen). Wenn sich jemand für den Artikel interessiert, geben Sie in den Kommentaren an, welches der Themen ich berücksichtigen möchte:

  • arbeiten mit text (parsen von stdout, codierungen)
  • Dateien (Informationen, Suche, Protokollierung)
  • arbeite mit winapi (verbinde dll, rufe funktionen auf, verarbeite antworten)
  • mit adodb arbeiten (wie man Daten aus der MSAccess-Datenbank liest)
  • Senden von E-Mails mit Go
  • einfacher RPC-Server

Jetzt auch beliebt: