Golang с sh сигнал прерывания - PullRequest
2 голосов
/ 24 апреля 2020

Я работаю над простым клиентом s sh, который подключается к нескольким удаленным хостам и позволяет читать файлы журналов. Мне удается подключиться и запустить команды на моей удаленной машине

stdin, err := session.StdinPipe()

if err != nil {
    log.Fatalf("Failed to establish stdin pipe: %v", err)
}

session.Stdout = os.Stdout
session.Stderr = os.Stderr

err = session.Shell()

if err != nil {
    log.Fatal(err)
}

reader := bufio.NewReader(os.Stdin)
for {
    text, _ := reader.ReadString('\n')

    if text == "exit\n" {
        break
    }

    if text == "br\n" {
        // ??? HOW ???
        continue
    }

    _, err = fmt.Fprintf(stdin, "%s", text)

    if err != nil {
        log.Fatal(err)
    }
}

Когда я запускаю tail -f access.tskv, я получаю вывод на моем стандартном компьютере. Моя проблема в том, что я не могу понять, как отправить сигнал прерывания в оболочку на удаленном компьютере.

Есть идеи?

Ответы [ 2 ]

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

session.Signal(ssh.SIGINT) должен делать трюк в соответствии с документацией API. Но по какой-то причине никакой сигнал не срабатывает на другом конце. Кажется, проблема с sshd на Ubuntu 18.04

https://github.com/golang/go/issues/16597#issuecomment -548053530

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

Чтобы отправить сигнал процессу (при условии, что ваши удаленные хосты * Unix), нам нужно найти идентификатор процесса, который мы будем sh отправлять в сигнал, используя следующую команду чтобы найти его:

ps aux | grep '[process-name]'

ссылка: https://www.cyberciti.biz/faq/linux-find-process-name/

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

kill -SIGINT [PID]

ссылка: https://bash.cyberciti.biz/guide/Sending_signal_to_Processes

Надеюсь, это поможет!

...